🧱 Add basis of tencent rtc
This commit is contained in:
parent
937e249b87
commit
419ed666f6
@ -165,6 +165,14 @@ PODS:
|
||||
- super_native_extensions (0.0.1):
|
||||
- Flutter
|
||||
- SwiftyGif (5.4.5)
|
||||
- tencent_rtc_sdk (0.0.1):
|
||||
- Flutter
|
||||
- TXCustomBeautyProcesserPlugin (= 1.0.2)
|
||||
- TXLiteAVSDK_Professional (~> 12.3.16995)
|
||||
- TXCustomBeautyProcesserPlugin (1.0.2)
|
||||
- TXLiteAVSDK_Professional (12.3.16995):
|
||||
- TXLiteAVSDK_Professional/Professional (= 12.3.16995)
|
||||
- TXLiteAVSDK_Professional/Professional (12.3.16995)
|
||||
- url_launcher_ios (0.0.1):
|
||||
- Flutter
|
||||
- volume_controller (0.0.1):
|
||||
@ -193,6 +201,7 @@ DEPENDENCIES:
|
||||
- sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`)
|
||||
- sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/darwin`)
|
||||
- super_native_extensions (from `.symlinks/plugins/super_native_extensions/ios`)
|
||||
- tencent_rtc_sdk (from `.symlinks/plugins/tencent_rtc_sdk/ios`)
|
||||
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
|
||||
- volume_controller (from `.symlinks/plugins/volume_controller/ios`)
|
||||
- wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
|
||||
@ -216,6 +225,8 @@ SPEC REPOS:
|
||||
- SDWebImage
|
||||
- sqlite3
|
||||
- SwiftyGif
|
||||
- TXCustomBeautyProcesserPlugin
|
||||
- TXLiteAVSDK_Professional
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
croppy:
|
||||
@ -256,6 +267,8 @@ EXTERNAL SOURCES:
|
||||
:path: ".symlinks/plugins/sqlite3_flutter_libs/darwin"
|
||||
super_native_extensions:
|
||||
:path: ".symlinks/plugins/super_native_extensions/ios"
|
||||
tencent_rtc_sdk:
|
||||
:path: ".symlinks/plugins/tencent_rtc_sdk/ios"
|
||||
url_launcher_ios:
|
||||
:path: ".symlinks/plugins/url_launcher_ios/ios"
|
||||
volume_controller:
|
||||
@ -300,6 +313,9 @@ SPEC CHECKSUMS:
|
||||
sqlite3_flutter_libs: f6acaa2172e6bb3e2e70c771661905080e8ebcf2
|
||||
super_native_extensions: b763c02dc3a8fd078389f410bf15149179020cb4
|
||||
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
|
||||
tencent_rtc_sdk: 13f066e69b87068b4cf3df90ad04097eb8773ae2
|
||||
TXCustomBeautyProcesserPlugin: 099393b941cb40eda12b3a80bf6c0319957b1cfd
|
||||
TXLiteAVSDK_Professional: 6e8fa18eeb0e52e6bbbcd97bab9ec9fbdc828df3
|
||||
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
|
||||
volume_controller: 3657a1f65bedb98fa41ff7dc5793537919f31b12
|
||||
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
|
||||
|
16
lib/database/database.native.dart
Normal file
16
lib/database/database.native.dart
Normal file
@ -0,0 +1,16 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:drift/drift.dart';
|
||||
import 'package:drift/native.dart';
|
||||
import 'package:island/database/drift_db.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
|
||||
AppDatabase constructDb() {
|
||||
final db = LazyDatabase(() async {
|
||||
final dbFolder = await getApplicationDocumentsDirectory();
|
||||
final file = File(p.join(dbFolder.path, 'solar_network_data.sqlite'));
|
||||
return NativeDatabase(file);
|
||||
});
|
||||
return AppDatabase(db);
|
||||
}
|
20
lib/database/database.web.dart
Normal file
20
lib/database/database.web.dart
Normal file
@ -0,0 +1,20 @@
|
||||
import 'package:drift/drift.dart';
|
||||
import 'package:drift/wasm.dart';
|
||||
import 'package:island/database/drift_db.dart';
|
||||
|
||||
AppDatabase constructDb() {
|
||||
return AppDatabase(connectOnWeb());
|
||||
}
|
||||
|
||||
DatabaseConnection connectOnWeb() {
|
||||
return DatabaseConnection.delayed(
|
||||
Future(() async {
|
||||
final result = await WasmDatabase.open(
|
||||
databaseName: 'solar_network_data',
|
||||
sqlite3Uri: Uri.parse('sqlite3.wasm'),
|
||||
driftWorkerUri: Uri.parse('drift_worker.dart.js'),
|
||||
);
|
||||
return result.resolvedExecutor;
|
||||
}),
|
||||
);
|
||||
}
|
@ -1,17 +1,13 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'package:drift/drift.dart';
|
||||
import 'package:drift/native.dart';
|
||||
import 'package:island/database/message.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
|
||||
part 'drift_db.g.dart';
|
||||
|
||||
// Define the database
|
||||
@DriftDatabase(tables: [ChatMessages])
|
||||
class AppDatabase extends _$AppDatabase {
|
||||
AppDatabase() : super(_openConnection());
|
||||
AppDatabase(super.e);
|
||||
|
||||
@override
|
||||
int get schemaVersion => 1;
|
||||
@ -75,12 +71,3 @@ class AppDatabase extends _$AppDatabase {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Helper to open the database connection
|
||||
LazyDatabase _openConnection() {
|
||||
return LazyDatabase(() async {
|
||||
final dbFolder = await getApplicationDocumentsDirectory();
|
||||
final file = File(p.join(dbFolder.path, 'solar_network_data.sqlite'));
|
||||
return NativeDatabase(file);
|
||||
});
|
||||
}
|
||||
|
@ -124,3 +124,14 @@ abstract class MessageSyncResponse with _$MessageSyncResponse {
|
||||
factory MessageSyncResponse.fromJson(Map<String, dynamic> json) =>
|
||||
_$MessageSyncResponseFromJson(json);
|
||||
}
|
||||
|
||||
@freezed
|
||||
abstract class ChatRealtimeJoinResponse with _$ChatRealtimeJoinResponse {
|
||||
const factory ChatRealtimeJoinResponse({
|
||||
required String token,
|
||||
required Map<String, dynamic> config,
|
||||
}) = _ChatRealtimeJoinResponse;
|
||||
|
||||
factory ChatRealtimeJoinResponse.fromJson(Map<String, dynamic> json) =>
|
||||
_$ChatRealtimeJoinResponseFromJson(json);
|
||||
}
|
||||
|
@ -1179,6 +1179,148 @@ as DateTime,
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// @nodoc
|
||||
mixin _$ChatRealtimeJoinResponse {
|
||||
|
||||
String get token; Map<String, dynamic> get config;
|
||||
/// Create a copy of ChatRealtimeJoinResponse
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@pragma('vm:prefer-inline')
|
||||
$ChatRealtimeJoinResponseCopyWith<ChatRealtimeJoinResponse> get copyWith => _$ChatRealtimeJoinResponseCopyWithImpl<ChatRealtimeJoinResponse>(this as ChatRealtimeJoinResponse, _$identity);
|
||||
|
||||
/// Serializes this ChatRealtimeJoinResponse to a JSON map.
|
||||
Map<String, dynamic> toJson();
|
||||
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) || (other.runtimeType == runtimeType&&other is ChatRealtimeJoinResponse&&(identical(other.token, token) || other.token == token)&&const DeepCollectionEquality().equals(other.config, config));
|
||||
}
|
||||
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType,token,const DeepCollectionEquality().hash(config));
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'ChatRealtimeJoinResponse(token: $token, config: $config)';
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract mixin class $ChatRealtimeJoinResponseCopyWith<$Res> {
|
||||
factory $ChatRealtimeJoinResponseCopyWith(ChatRealtimeJoinResponse value, $Res Function(ChatRealtimeJoinResponse) _then) = _$ChatRealtimeJoinResponseCopyWithImpl;
|
||||
@useResult
|
||||
$Res call({
|
||||
String token, Map<String, dynamic> config
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
/// @nodoc
|
||||
class _$ChatRealtimeJoinResponseCopyWithImpl<$Res>
|
||||
implements $ChatRealtimeJoinResponseCopyWith<$Res> {
|
||||
_$ChatRealtimeJoinResponseCopyWithImpl(this._self, this._then);
|
||||
|
||||
final ChatRealtimeJoinResponse _self;
|
||||
final $Res Function(ChatRealtimeJoinResponse) _then;
|
||||
|
||||
/// Create a copy of ChatRealtimeJoinResponse
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline') @override $Res call({Object? token = null,Object? config = null,}) {
|
||||
return _then(_self.copyWith(
|
||||
token: null == token ? _self.token : token // ignore: cast_nullable_to_non_nullable
|
||||
as String,config: null == config ? _self.config : config // ignore: cast_nullable_to_non_nullable
|
||||
as Map<String, dynamic>,
|
||||
));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// @nodoc
|
||||
@JsonSerializable()
|
||||
|
||||
class _ChatRealtimeJoinResponse implements ChatRealtimeJoinResponse {
|
||||
const _ChatRealtimeJoinResponse({required this.token, required final Map<String, dynamic> config}): _config = config;
|
||||
factory _ChatRealtimeJoinResponse.fromJson(Map<String, dynamic> json) => _$ChatRealtimeJoinResponseFromJson(json);
|
||||
|
||||
@override final String token;
|
||||
final Map<String, dynamic> _config;
|
||||
@override Map<String, dynamic> get config {
|
||||
if (_config is EqualUnmodifiableMapView) return _config;
|
||||
// ignore: implicit_dynamic_type
|
||||
return EqualUnmodifiableMapView(_config);
|
||||
}
|
||||
|
||||
|
||||
/// Create a copy of ChatRealtimeJoinResponse
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@override @JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@pragma('vm:prefer-inline')
|
||||
_$ChatRealtimeJoinResponseCopyWith<_ChatRealtimeJoinResponse> get copyWith => __$ChatRealtimeJoinResponseCopyWithImpl<_ChatRealtimeJoinResponse>(this, _$identity);
|
||||
|
||||
@override
|
||||
Map<String, dynamic> toJson() {
|
||||
return _$ChatRealtimeJoinResponseToJson(this, );
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) || (other.runtimeType == runtimeType&&other is _ChatRealtimeJoinResponse&&(identical(other.token, token) || other.token == token)&&const DeepCollectionEquality().equals(other._config, _config));
|
||||
}
|
||||
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType,token,const DeepCollectionEquality().hash(_config));
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'ChatRealtimeJoinResponse(token: $token, config: $config)';
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract mixin class _$ChatRealtimeJoinResponseCopyWith<$Res> implements $ChatRealtimeJoinResponseCopyWith<$Res> {
|
||||
factory _$ChatRealtimeJoinResponseCopyWith(_ChatRealtimeJoinResponse value, $Res Function(_ChatRealtimeJoinResponse) _then) = __$ChatRealtimeJoinResponseCopyWithImpl;
|
||||
@override @useResult
|
||||
$Res call({
|
||||
String token, Map<String, dynamic> config
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
/// @nodoc
|
||||
class __$ChatRealtimeJoinResponseCopyWithImpl<$Res>
|
||||
implements _$ChatRealtimeJoinResponseCopyWith<$Res> {
|
||||
__$ChatRealtimeJoinResponseCopyWithImpl(this._self, this._then);
|
||||
|
||||
final _ChatRealtimeJoinResponse _self;
|
||||
final $Res Function(_ChatRealtimeJoinResponse) _then;
|
||||
|
||||
/// Create a copy of ChatRealtimeJoinResponse
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@override @pragma('vm:prefer-inline') $Res call({Object? token = null,Object? config = null,}) {
|
||||
return _then(_ChatRealtimeJoinResponse(
|
||||
token: null == token ? _self.token : token // ignore: cast_nullable_to_non_nullable
|
||||
as String,config: null == config ? _self._config : config // ignore: cast_nullable_to_non_nullable
|
||||
as Map<String, dynamic>,
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// dart format on
|
||||
|
@ -223,3 +223,14 @@ Map<String, dynamic> _$MessageSyncResponseToJson(
|
||||
'changes': instance.changes.map((e) => e.toJson()).toList(),
|
||||
'current_timestamp': instance.currentTimestamp.toIso8601String(),
|
||||
};
|
||||
|
||||
_ChatRealtimeJoinResponse _$ChatRealtimeJoinResponseFromJson(
|
||||
Map<String, dynamic> json,
|
||||
) => _ChatRealtimeJoinResponse(
|
||||
token: json['token'] as String,
|
||||
config: json['config'] as Map<String, dynamic>,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$ChatRealtimeJoinResponseToJson(
|
||||
_ChatRealtimeJoinResponse instance,
|
||||
) => <String, dynamic>{'token': instance.token, 'config': instance.config};
|
||||
|
11
lib/pods/database.dart
Normal file
11
lib/pods/database.dart
Normal file
@ -0,0 +1,11 @@
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:island/database/drift_db.dart';
|
||||
|
||||
import 'package:island/database/database.native.dart'
|
||||
if (dart.library.html) 'package:island/database/database.web.dart';
|
||||
|
||||
final databaseProvider = Provider<AppDatabase>((ref) {
|
||||
final db = constructDb();
|
||||
ref.onDispose(() => db.close());
|
||||
return db;
|
||||
});
|
@ -2,16 +2,10 @@ import 'dart:io';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:island/database/drift_db.dart';
|
||||
import 'package:island/pods/database.dart';
|
||||
import 'package:path/path.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
|
||||
final databaseProvider = Provider<AppDatabase>((ref) {
|
||||
final db = AppDatabase();
|
||||
ref.onDispose(() => db.close());
|
||||
return db;
|
||||
});
|
||||
|
||||
Future<void> resetDatabase(WidgetRef ref) async {
|
||||
if (kIsWeb) return;
|
||||
|
||||
|
@ -10,11 +10,13 @@ import 'package:island/database/message_repository.dart';
|
||||
import 'package:island/models/chat.dart';
|
||||
import 'package:island/models/file.dart';
|
||||
import 'package:island/pods/config.dart';
|
||||
import 'package:island/pods/message.dart';
|
||||
import 'package:island/pods/database.dart';
|
||||
import 'package:island/pods/network.dart';
|
||||
import 'package:island/pods/userinfo.dart';
|
||||
import 'package:island/pods/websocket.dart';
|
||||
import 'package:island/route.gr.dart';
|
||||
import 'package:island/screens/posts/compose.dart';
|
||||
import 'package:island/services/rtc.dart';
|
||||
import 'package:island/widgets/alert.dart';
|
||||
import 'package:island/widgets/content/cloud_file_collection.dart';
|
||||
import 'package:island/widgets/content/cloud_files.dart';
|
||||
@ -471,6 +473,21 @@ class ChatRoomScreen extends HookConsumerWidget {
|
||||
error: (_, __) => const Text('Error'),
|
||||
),
|
||||
actions: [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
final user = ref.watch(userInfoProvider);
|
||||
if (currentlyJoined) {
|
||||
leaveRealtimeChat(chatRoom.value!);
|
||||
} else {
|
||||
joinRealtimeChat(
|
||||
ref.watch(apiClientProvider),
|
||||
chatRoom.value!,
|
||||
user.value!,
|
||||
);
|
||||
}
|
||||
},
|
||||
icon: const Icon(Symbols.video_call),
|
||||
),
|
||||
IconButton(
|
||||
icon: const Icon(Icons.more_vert),
|
||||
onPressed: () {
|
||||
|
51
lib/services/rtc.dart
Normal file
51
lib/services/rtc.dart
Normal file
@ -0,0 +1,51 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:island/models/chat.dart';
|
||||
import 'package:island/models/user.dart';
|
||||
import 'package:tencent_rtc_sdk/trtc_cloud.dart';
|
||||
import 'package:tencent_rtc_sdk/trtc_cloud_def.dart';
|
||||
import 'package:tencent_rtc_sdk/trtc_cloud_listener.dart';
|
||||
|
||||
Future<TRTCCloud> _getTRTCCloud() async {
|
||||
return TRTCCloud.sharedInstance();
|
||||
}
|
||||
|
||||
bool currentlyJoined = false;
|
||||
|
||||
Future<void> joinRealtimeChat(
|
||||
Dio apiClient,
|
||||
SnChatRoom chat,
|
||||
SnAccount user,
|
||||
) async {
|
||||
final resp = await apiClient.get('/chat/realtime/${chat.id}');
|
||||
final data = ChatRealtimeJoinResponse.fromJson(resp.data);
|
||||
final config = data.config;
|
||||
final cloud = await _getTRTCCloud();
|
||||
cloud.setConsoleEnabled(true);
|
||||
cloud.registerListener(
|
||||
TRTCCloudListener(
|
||||
onRemoteUserEnterRoom: (userId) {
|
||||
print('onRemoteUserEnterRoom: $userId');
|
||||
},
|
||||
onRemoteUserLeaveRoom: (userId, reason) {
|
||||
print('onRemoteUserLeaveRoom: $userId, $reason');
|
||||
},
|
||||
),
|
||||
);
|
||||
cloud.enterRoom(
|
||||
TRTCParams(
|
||||
sdkAppId: config['app_id'],
|
||||
userId: user.name,
|
||||
userSig: data.token,
|
||||
roomId: chat.id,
|
||||
role: TRTCRoleType.anchor,
|
||||
),
|
||||
TRTCAppScene.voiceChatRoom,
|
||||
);
|
||||
cloud.startLocalAudio(TRTCAudioQuality.speech);
|
||||
currentlyJoined = true;
|
||||
}
|
||||
|
||||
Future<void> leaveRealtimeChat(SnChatRoom chat) async {
|
||||
final cloud = await _getTRTCCloud();
|
||||
cloud.exitRoom();
|
||||
}
|
@ -6,6 +6,7 @@ import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:island/pods/userinfo.dart';
|
||||
import 'package:island/pods/websocket.dart';
|
||||
import 'package:island/route.dart';
|
||||
import 'package:material_symbols_icons/material_symbols_icons.dart';
|
||||
@ -258,6 +259,7 @@ class _WebSocketIndicator extends HookConsumerWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final user = ref.watch(userInfoProvider);
|
||||
final websocketState = ref.watch(websocketStateProvider);
|
||||
final indicatorHeight = MediaQuery.of(context).padding.top + 60;
|
||||
|
||||
@ -277,7 +279,10 @@ class _WebSocketIndicator extends HookConsumerWidget {
|
||||
|
||||
return AnimatedPositioned(
|
||||
duration: Duration(milliseconds: 1850),
|
||||
top: websocketState == WebSocketState.connected() ? -indicatorHeight : 0,
|
||||
top:
|
||||
!user.hasValue || websocketState == WebSocketState.connected()
|
||||
? -indicatorHeight
|
||||
: 0,
|
||||
curve: Curves.fastLinearToSlowEaseIn,
|
||||
left: 0,
|
||||
right: 0,
|
||||
|
@ -23,6 +23,7 @@ import shared_preferences_foundation
|
||||
import sqflite_darwin
|
||||
import sqlite3_flutter_libs
|
||||
import super_native_extensions
|
||||
import tencent_rtc_sdk
|
||||
import url_launcher_macos
|
||||
import volume_controller
|
||||
import wakelock_plus
|
||||
@ -46,6 +47,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
|
||||
Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin"))
|
||||
SuperNativeExtensionsPlugin.register(with: registry.registrar(forPlugin: "SuperNativeExtensionsPlugin"))
|
||||
TencentRTCCloud.register(with: registry.registrar(forPlugin: "TencentRTCCloud"))
|
||||
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
||||
VolumeControllerPlugin.register(with: registry.registrar(forPlugin: "VolumeControllerPlugin"))
|
||||
WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin"))
|
||||
|
@ -1,6 +1,8 @@
|
||||
PODS:
|
||||
- bitsdojo_window_macos (0.0.1):
|
||||
- FlutterMacOS
|
||||
- croppy (0.0.1):
|
||||
- FlutterMacOS
|
||||
- device_info_plus (0.0.1):
|
||||
- FlutterMacOS
|
||||
- file_picker (0.0.1):
|
||||
@ -94,8 +96,6 @@ PODS:
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- PromisesObjC (2.4.0)
|
||||
- quill_native_bridge_macos (0.0.1):
|
||||
- FlutterMacOS
|
||||
- SAMKeychain (1.5.3)
|
||||
- shared_preferences_foundation (0.0.1):
|
||||
- Flutter
|
||||
@ -127,6 +127,10 @@ PODS:
|
||||
- sqlite3/rtree
|
||||
- super_native_extensions (0.0.1):
|
||||
- FlutterMacOS
|
||||
- tencent_rtc_sdk (10.4):
|
||||
- FlutterMacOS
|
||||
- TXLiteAVSDK_TRTC_Mac (~> 12.3.16995)
|
||||
- TXLiteAVSDK_TRTC_Mac (12.3.16995)
|
||||
- url_launcher_macos (0.0.1):
|
||||
- FlutterMacOS
|
||||
- volume_controller (0.0.1):
|
||||
@ -136,6 +140,7 @@ PODS:
|
||||
|
||||
DEPENDENCIES:
|
||||
- bitsdojo_window_macos (from `Flutter/ephemeral/.symlinks/plugins/bitsdojo_window_macos/macos`)
|
||||
- croppy (from `Flutter/ephemeral/.symlinks/plugins/croppy/macos`)
|
||||
- device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`)
|
||||
- file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`)
|
||||
- file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`)
|
||||
@ -150,11 +155,11 @@ DEPENDENCIES:
|
||||
- media_kit_video (from `Flutter/ephemeral/.symlinks/plugins/media_kit_video/macos`)
|
||||
- package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`)
|
||||
- path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`)
|
||||
- quill_native_bridge_macos (from `Flutter/ephemeral/.symlinks/plugins/quill_native_bridge_macos/macos`)
|
||||
- shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`)
|
||||
- sqflite_darwin (from `Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin`)
|
||||
- sqlite3_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/darwin`)
|
||||
- super_native_extensions (from `Flutter/ephemeral/.symlinks/plugins/super_native_extensions/macos`)
|
||||
- tencent_rtc_sdk (from `Flutter/ephemeral/.symlinks/plugins/tencent_rtc_sdk/macos`)
|
||||
- url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
|
||||
- volume_controller (from `Flutter/ephemeral/.symlinks/plugins/volume_controller/macos`)
|
||||
- wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`)
|
||||
@ -173,10 +178,13 @@ SPEC REPOS:
|
||||
- PromisesObjC
|
||||
- SAMKeychain
|
||||
- sqlite3
|
||||
- TXLiteAVSDK_TRTC_Mac
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
bitsdojo_window_macos:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/bitsdojo_window_macos/macos
|
||||
croppy:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/croppy/macos
|
||||
device_info_plus:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos
|
||||
file_picker:
|
||||
@ -205,8 +213,6 @@ EXTERNAL SOURCES:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos
|
||||
path_provider_foundation:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin
|
||||
quill_native_bridge_macos:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/quill_native_bridge_macos/macos
|
||||
shared_preferences_foundation:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin
|
||||
sqflite_darwin:
|
||||
@ -215,6 +221,8 @@ EXTERNAL SOURCES:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/darwin
|
||||
super_native_extensions:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/super_native_extensions/macos
|
||||
tencent_rtc_sdk:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/tencent_rtc_sdk/macos
|
||||
url_launcher_macos:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
|
||||
volume_controller:
|
||||
@ -224,6 +232,7 @@ EXTERNAL SOURCES:
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
bitsdojo_window_macos: 7959fb0ca65a3ccda30095c181ecb856fae48ea9
|
||||
croppy: d9bfc8c02f3cd1851f669a421df298a474b78f43
|
||||
device_info_plus: 4fb280989f669696856f8b129e4a5e3cd6c48f76
|
||||
file_picker: 7584aae6fa07a041af2b36a2655122d42f578c1a
|
||||
file_selector_macos: 6280b52b459ae6c590af5d78fc35c7267a3c4b31
|
||||
@ -248,13 +257,14 @@ SPEC CHECKSUMS:
|
||||
package_info_plus: f0052d280d17aa382b932f399edf32507174e870
|
||||
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
|
||||
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
|
||||
quill_native_bridge_macos: 2b005cb56902bb740e0cd9620aa399dfac6b4882
|
||||
SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c
|
||||
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
|
||||
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
|
||||
sqlite3: fc1400008a9b3525f5914ed715a5d1af0b8f4983
|
||||
sqlite3_flutter_libs: f6acaa2172e6bb3e2e70c771661905080e8ebcf2
|
||||
super_native_extensions: c2795d6d9aedf4a79fae25cb6160b71b50549189
|
||||
tencent_rtc_sdk: bedbb2bcdf50f5cff9b551d19ed7228391ba1a5c
|
||||
TXLiteAVSDK_TRTC_Mac: bd4218d0415c950913f8f893267e18dd4333f633
|
||||
url_launcher_macos: 0fba8ddabfc33ce0a9afe7c5fef5aab3d8d2d673
|
||||
volume_controller: 5c068e6d085c80dadd33fc2c918d2114b775b3dd
|
||||
wakelock_plus: 21ddc249ac4b8d018838dbdabd65c5976c308497
|
||||
|
@ -27,6 +27,7 @@
|
||||
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
|
||||
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
|
||||
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
|
||||
73FC47352DCA4A98007D6BA4 /* ScreenCaptureKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73FC47332DCA4A96007D6BA4 /* ScreenCaptureKit.framework */; };
|
||||
81323E2800290FDA28F313ED /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 99A9898F9135B8B94E49BD2B /* Pods_Runner.framework */; };
|
||||
B48F10F93F6AB0C5490C5A07 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = B48604B824333A68BCFDF84A /* GoogleService-Info.plist */; };
|
||||
C2C92AFDE3C1A59CFAF66C7C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DEA64C50BF85AF58D10A213 /* Pods_RunnerTests.framework */; };
|
||||
@ -49,19 +50,6 @@
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
33CC110E2044A8840003C045 /* Bundle Framework */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 10;
|
||||
files = (
|
||||
);
|
||||
name = "Bundle Framework";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
1DEA64C50BF85AF58D10A213 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
30FD87E3D579B3530B39AD6D /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
|
||||
@ -84,6 +72,7 @@
|
||||
43D88ABB378B9C7DB274779D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||
45CA28B3BA0F7F54A2F794A5 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
4FD6FBF4162DE650C8F39C11 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||
73FC47332DCA4A96007D6BA4 /* ScreenCaptureKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ScreenCaptureKit.framework; path = System/Library/Frameworks/ScreenCaptureKit.framework; sourceTree = SDKROOT; };
|
||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
|
||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
|
||||
97CE52E8413D7559BF9A7981 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||
@ -105,6 +94,7 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
73FC47352DCA4A98007D6BA4 /* ScreenCaptureKit.framework in Frameworks */,
|
||||
81323E2800290FDA28F313ED /* Pods_Runner.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@ -204,6 +194,7 @@
|
||||
D73912EC22F37F3D000D13A0 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
73FC47332DCA4A96007D6BA4 /* ScreenCaptureKit.framework */,
|
||||
99A9898F9135B8B94E49BD2B /* Pods_Runner.framework */,
|
||||
1DEA64C50BF85AF58D10A213 /* Pods_RunnerTests.framework */,
|
||||
);
|
||||
@ -240,7 +231,6 @@
|
||||
33CC10E92044A3C60003C045 /* Sources */,
|
||||
33CC10EA2044A3C60003C045 /* Frameworks */,
|
||||
33CC10EB2044A3C60003C045 /* Resources */,
|
||||
33CC110E2044A8840003C045 /* Bundle Framework */,
|
||||
3399D490228B24CF009A79C7 /* ShellScript */,
|
||||
F1E275A871246799FC3019F6 /* [CP] Embed Pods Frameworks */,
|
||||
8D06F41203F1FD2FDE04DC7F /* [CP] Copy Pods Resources */,
|
||||
|
@ -1738,6 +1738,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.3.1"
|
||||
tencent_rtc_sdk:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: tencent_rtc_sdk
|
||||
sha256: "0ec7f3a32c443573a0509d06bf390e11a709fca338a46645c1d4dbc3f17f029a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "12.3.6"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -91,6 +91,7 @@ dependencies:
|
||||
flutter_expandable_fab: ^2.5.0
|
||||
markdown_editor_plus: ^0.2.15
|
||||
croppy: ^1.3.6
|
||||
tencent_rtc_sdk: ^12.3.6
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
|
2
web/_redirects
Normal file
2
web/_redirects
Normal file
@ -0,0 +1,2 @@
|
||||
/assets/assets/translations/en.json /assets/assets/translations/en-US.json 301
|
||||
/assets/assets/translations/zh.json /assets/assets/translations/zh-CN.json 301
|
13631
web/drift_worker.dart.js
Normal file
13631
web/drift_worker.dart.js
Normal file
File diff suppressed because one or more lines are too long
BIN
web/sqlite3.wasm
Normal file
BIN
web/sqlite3.wasm
Normal file
Binary file not shown.
@ -17,6 +17,7 @@
|
||||
#include <media_kit_video/media_kit_video_plugin_c_api.h>
|
||||
#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>
|
||||
#include <super_native_extensions/super_native_extensions_plugin_c_api.h>
|
||||
#include <tencent_rtc_sdk/trtc_plugin_c_api.h>
|
||||
#include <url_launcher_windows/url_launcher_windows.h>
|
||||
#include <volume_controller/volume_controller_plugin_c_api.h>
|
||||
|
||||
@ -43,6 +44,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||
registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin"));
|
||||
SuperNativeExtensionsPluginCApiRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("SuperNativeExtensionsPluginCApi"));
|
||||
TrtcPluginCApiRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("TrtcPluginCApi"));
|
||||
UrlLauncherWindowsRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
|
||||
VolumeControllerPluginCApiRegisterWithRegistrar(
|
||||
|
@ -14,6 +14,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
|
||||
media_kit_video
|
||||
sqlite3_flutter_libs
|
||||
super_native_extensions
|
||||
tencent_rtc_sdk
|
||||
url_launcher_windows
|
||||
volume_controller
|
||||
)
|
||||
|
Loading…
x
Reference in New Issue
Block a user