Skip to content

Upgrade 3.5 #30

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 47 commits into from
Jun 2, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
864f429
Updated pubspec
resashkin Sep 18, 2024
a9c623f
Fixed pubspec.lock
resashkin Sep 18, 2024
8d7f5ca
UserProfile...
resashkin Sep 20, 2024
5f67ecf
Added tags
resashkin Sep 21, 2024
b483405
Define screen
resashkin Sep 21, 2024
8f6c22a
Flutter upgrade * Refactored UserProfile
resashkin Dec 20, 2024
293bf87
Make create button smaller
resashkin Dec 20, 2024
8a8b71a
Show digest for period
resashkin Jan 1, 2025
8e7a8b6
User change action * Hide suggestions from UserProfile
resashkin Jan 4, 2025
0b4b690
Bump
resashkin Jan 5, 2025
7c51773
Gitignore
resashkin Jan 19, 2025
96e16a3
Just deployed to the web :)
resashkin Jan 19, 2025
17522bb
Telegram Web App Support. Offline mode true by default * Telegram. Fi…
resashkin Jan 20, 2025
8f6756b
Added OTP verification * Upgraded deps (bloc, immutable_collections, …
resashkin Jan 26, 2025
710ae63
Force auth or signup
resashkin Jan 26, 2025
c5b81a4
Enabled colored emoji
resashkin Feb 5, 2025
a82b0f7
Fix assets * Remove useless font * Integrate fvm * Integrate detective
resashkin Feb 22, 2025
ec5a5ea
Disable Apple Watch (TEMP) * Extract using in telegram bot
resashkin Feb 22, 2025
ab8f442
MindScreen. Long press calendar -> change flag
resashkin Mar 23, 2025
9c1bc22
MindScreen. Implemented MonthView
resashkin Mar 24, 2025
69dc45d
Make Tabs great again * Bloc for tabs
resashkin May 2, 2025
4f1edd7
Added TabsRepository + Bloc * ReactiveSharedPrefs * JSON generation *…
resashkin May 16, 2025
296a975
Show bodyWidgets by type
resashkin May 17, 2025
1804e7a
Fix problem with clear
resashkin May 19, 2025
595dda2
Hide features from settings * Add TabsSettings Screen * Reflect tabs …
resashkin May 21, 2025
f90b776
Disable Google Sign In * Upgrade to Flutter 3.32.0
resashkin May 22, 2025
fafc3fc
Fixed bug with first tab selected
resashkin May 22, 2025
dc9bed4
Added empty state to insights
resashkin May 22, 2025
0ce9d4a
Upgraded tabs settings
resashkin May 24, 2025
2f55eb4
Fixed crash
resashkin May 25, 2025
3e2b31c
Fix
resashkin May 25, 2025
7a9a0d0
Fix icons
resashkin May 25, 2025
892a0c2
Fix
resashkin May 25, 2025
5755530
Fix default value for offline mode
resashkin May 25, 2025
85a7f41
Bump version * Removed group
resashkin May 25, 2025
1956e5c
Fix default tabs * Disable offline mode
resashkin May 25, 2025
cb9c15d
Sign up rename * Hide profile for now
resashkin May 25, 2025
58ef5b2
Bump
resashkin May 25, 2025
4293595
Renamings
resashkin May 25, 2025
18ef650
Return back adaptive bottom bar
resashkin May 26, 2025
ac17067
Fix
resashkin May 26, 2025
fb20476
Bump
resashkin May 26, 2025
9bc0c36
Return back kekable group
resashkin May 26, 2025
39e4fb6
Switched certs
resashkin May 27, 2025
26fe6c5
Regenerate android project
resashkin May 29, 2025
288b94d
Removed workmanager
resashkin May 29, 2025
58c777d
Fixed release for android
resashkin May 29, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Added TabsRepository + Bloc * ReactiveSharedPrefs * JSON generation *…
… renamed bloc methods
  • Loading branch information
resashkin committed May 16, 2025
commit 4f1edd7f15dc8cf087d7904ddcca1d2c990e2a5e
11 changes: 11 additions & 0 deletions lib/di/containers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import 'package:flutter_simple_dependency_injection/injector.dart';
import 'package:hive/hive.dart';
import 'package:keklist/domain/constants.dart';
import 'package:keklist/domain/hive_constants.dart';
import 'package:keklist/domain/repositories/tabs/tabs_settings_repository.dart';
import 'package:keklist/domain/repositories/tabs/tabs_settings_shared_preferences_repository.dart';
import 'package:keklist/domain/services/auth/auth_service.dart';
import 'package:keklist/domain/repositories/mind/object/mind_object.dart';
import 'package:keklist/domain/repositories/mind/mind_hive_repository.dart';
Expand All @@ -11,12 +13,18 @@ import 'package:keklist/domain/repositories/settings/settings_hive_repository.da
import 'package:keklist/domain/repositories/settings/settings_repository.dart';
import 'package:keklist/domain/services/mind_service/main_supabase_service.dart';
import 'package:keklist/presentation/core/helpers/platform_utils.dart';
import 'package:streaming_shared_preferences/streaming_shared_preferences.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:keklist/presentation/cubits/mind_searcher/mind_searcher_cubit.dart';
import 'package:keklist/presentation/native/ios/watch/watch_communication_manager.dart';
import 'package:keklist/domain/services/mind_service/main_service.dart';

final class MainContainer {
final StreamingSharedPreferences _streamingSharedPreferences;

MainContainer({required StreamingSharedPreferences streamingSharedPreferences})
: _streamingSharedPreferences = streamingSharedPreferences;

Injector initialize(Injector injector) {
injector.map<MindService>(
(injector) => MindSupabaseService(),
Expand All @@ -41,6 +49,9 @@ final class MainContainer {
injector.map<SettingsRepository>(
(injector) => SettingsHiveRepository(box: Hive.box<SettingsObject>(HiveConstants.settingsBoxName)),
);
injector.map<TabsSettingsRepository>(
(injector) => TabsSettingsSharedPreferencesRepository(preferences: _streamingSharedPreferences),
);
injector.map<AuthService>(
(injector) => AuthSupabaseService(client: Supabase.instance.client),
);
Expand Down
2 changes: 2 additions & 0 deletions lib/domain/hive_constants.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
class HiveConstants {
static const String settingsBoxName = 'settings_box';
static const String globalSettingsIndex = 'global_settings';
static const String tabsSettingsBoxName = 'tabs_settings_box';
static const String tabsSettingsIndex = 'tabs_settings';
static const String mindBoxName = 'mind_box';
static const String mindQueueTransactionsBoxName = 'mind_queue_transactions_box';
static const String messageChatBoxName = 'message_chat_box';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import 'package:hive_flutter/hive_flutter.dart';
import 'package:keklist/domain/repositories/feature_flags/feature_flag_repository.dart';
import 'package:keklist/presentation/core/enum_from_string.dart';
import 'package:keklist/presentation/core/helpers/enum_utils.dart';

part 'feature_flag_object.g.dart';

@HiveType(typeId: 0)
@HiveType(typeId: 4)
final class FeatureFlagObject extends HiveObject {
@HiveField(0, defaultValue: null)
late String flagType;
Expand All @@ -13,7 +13,7 @@ final class FeatureFlagObject extends HiveObject {
late bool value;

FeatureFlagData? toFeatureFlagData() {
final FeatureFlagType? featureFlagType = enumFromString(
final FeatureFlagType? featureFlagType = EnumUtils.enumFromString(
value: flagType,
fromValues: FeatureFlagType.values,
);
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions lib/domain/repositories/message/message/message_object.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:hive/hive.dart';
import 'package:keklist/presentation/core/enum_from_string.dart';
import 'package:keklist/presentation/core/helpers/enum_utils.dart';
import 'package:keklist/domain/services/entities/message.dart';

part 'message_object.g.dart';
Expand Down Expand Up @@ -28,6 +28,6 @@ final class MessageObject extends HiveObject {
text: text,
rootMindId: rootMindId,
timestamp: timestamp,
sender: enumFromString(value: sender, fromValues: MessageSender.values) ?? MessageSender.assistant,
sender: EnumUtils.enumFromString(value: sender, fromValues: MessageSender.values) ?? MessageSender.assistant,
);
}
72 changes: 72 additions & 0 deletions lib/domain/repositories/tabs/models/tabs_settings.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';

part 'tabs_settings.g.dart';

@JsonSerializable()
final class TabsSettings with EquatableMixin {
final List<TabModel> tabModels;
final int defaultSelectedTabIndex;

TabsSettings({
required this.tabModels,
required this.defaultSelectedTabIndex,
});

@override
List<Object?> get props => [
tabModels,
defaultSelectedTabIndex,
];

@override
bool? get stringify => true;

// JsonSerializable
factory TabsSettings.fromJson(Map<String, dynamic> json) => _$TabsSettingsFromJson(json);
Map<String, dynamic> toJson() => _$TabsSettingsToJson(this);
}

@JsonSerializable()
final class TabModel with EquatableMixin {
final TabType type;

TabModel({required this.type});

@override
List<Object?> get props => [type];

@override
bool? get stringify => true;

// JsonSerializable
factory TabModel.fromJson(Map<String, dynamic> json) => _$TabModelFromJson(json);
Map<String, dynamic> toJson() => _$TabModelToJson(this);
}

@JsonEnum()
enum TabType implements Equatable {
calendar,
insights,
settings,
profile;

String get label {
switch (this) {
case TabType.calendar:
return 'Calendar';
case TabType.insights:
return 'Insights';
case TabType.settings:
return 'Settings';
case TabType.profile:
return 'Profile';
}
}

@override
List<Object?> get props => [this];

@override
bool? get stringify => true;
}
35 changes: 35 additions & 0 deletions lib/domain/repositories/tabs/models/tabs_settings.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions lib/domain/repositories/tabs/tabs_settings_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import 'dart:async';

import 'package:keklist/domain/repositories/tabs/models/tabs_settings.dart';

abstract class TabsSettingsRepository {
TabsSettings get value;
Stream<TabsSettings> get stream;

FutureOr<void> updateTabList({required List<TabModel> tabList});
FutureOr<void> updateDefaultSelectedTabIndex({required List<TabModel> defaultSelectedTabIndex});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import 'dart:async';

import 'package:keklist/domain/repositories/tabs/models/tabs_settings.dart';
import 'package:keklist/domain/repositories/tabs/tabs_settings_repository.dart';
import 'package:rxdart/rxdart.dart';
import 'package:streaming_shared_preferences/streaming_shared_preferences.dart';

final class TabsSettingsSharedPreferencesRepository extends TabsSettingsRepository {
final StreamingSharedPreferences _preferences;
final Preference<TabsSettings?> _tabsSettingsPreferences;
final BehaviorSubject<TabsSettings> _behaviorSubject = BehaviorSubject<TabsSettings>();

TabsSettingsSharedPreferencesRepository({required StreamingSharedPreferences preferences})
: _preferences = preferences,
_tabsSettingsPreferences = preferences.getCustomValue<TabsSettings?>(
'tabs_settings',
defaultValue: null,
adapter: JsonAdapter<TabsSettings>(
deserializer: (jsonObject) {
final Map<String, dynamic> json = (jsonObject as Map<String, dynamic>);
return TabsSettings.fromJson(json);
},
),
) {
_updateSettings(
TabsSettings(
defaultSelectedTabIndex: 0,
tabModels: [
TabModel(type: TabType.calendar),
TabModel(type: TabType.insights),
TabModel(type: TabType.profile),
],
),
);
_behaviorSubject.addStream(
_tabsSettingsPreferences.asBroadcastStream().whereNotNull().debounceTime(const Duration(milliseconds: 10)),
);
}

@override
Stream<TabsSettings> get stream => _behaviorSubject;

@override
TabsSettings get value => _behaviorSubject.value;

@override
FutureOr<void> updateDefaultSelectedTabIndex({required List<TabModel> defaultSelectedTabIndex}) {}

@override
FutureOr<void> updateTabList({required List<TabModel> tabList}) {}

FutureOr<void> _updateSettings(TabsSettings settings) async {
_preferences.setCustomValue(
'tabs_settings',
settings,
adapter: JsonAdapter<TabsSettings>(),
);
}
}
4 changes: 2 additions & 2 deletions lib/domain/services/entities/message.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:equatable/equatable.dart';
import 'package:keklist/presentation/core/enum_from_string.dart';
import 'package:keklist/presentation/core/helpers/enum_utils.dart';
import 'package:keklist/domain/repositories/message/message/message_object.dart';

class Message with EquatableMixin {
Expand Down Expand Up @@ -33,7 +33,7 @@ class Message with EquatableMixin {
..text = text
..rootMindId = rootMindId
..timestamp = timestamp
..sender = stringFromEnum(sender);
..sender = EnumUtils.stringFromEnum(sender);
}

enum MessageSender { user, system, assistant }
6 changes: 3 additions & 3 deletions lib/keklist_app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import 'package:keklist/presentation/core/helpers/bloc_utils.dart';
import 'package:keklist/presentation/core/dispose_bag.dart';
import 'package:keklist/presentation/core/screen/kek_screen_state.dart';
import 'package:keklist/presentation/core/widgets/sensitive_widget.dart';
import 'package:keklist/presentation/screens/tab_container/tab_container_screen.dart';
import 'package:keklist/presentation/screens/tabs_container/tabs_container_screen.dart';

final class KeklistApp extends StatefulWidget {
const KeklistApp({super.key});
Expand All @@ -23,7 +23,7 @@ final class KeklistAppState extends KekWidgetState<KeklistApp> {
void initState() {
super.initState();

subscribeTo<SettingsBloc>(
subscribeToBloc<SettingsBloc>(
onNewState: (state) {
if (state is SettingsDataState) {
if (state.settings.openAIKey != null) {
Expand All @@ -42,7 +42,7 @@ final class KeklistAppState extends KekWidgetState<KeklistApp> {
Widget build(BuildContext context) {
return MaterialApp(
title: 'Keklist',
home: const TabContainerScreen(),
home: const TabsContainerScreen(),
theme: _isDarkMode ? Themes.dark : Themes.light,
darkTheme: Themes.dark,
themeMode: ThemeMode.light,
Expand Down
16 changes: 12 additions & 4 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_simple_dependency_injection/injector.dart';
import 'package:flutter_web_plugins/url_strategy.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:keklist/domain/repositories/tabs/tabs_settings_repository.dart';
// import 'package:home_widget/home_widget.dart';
// import 'package:home_widget/home_widget.dart';
import 'package:keklist/domain/services/auth/auth_service.dart';
Expand All @@ -19,9 +20,11 @@ import 'package:keklist/domain/hive_constants.dart';
import 'package:keklist/domain/repositories/message/message/message_object.dart';
import 'package:keklist/domain/repositories/settings/object/settings_object.dart';
import 'package:keklist/native/web/telegram/telegram_web_initializer.dart';
import 'package:keklist/presentation/blocs/tab_container_bloc/tab_container_bloc.dart';
import 'package:keklist/presentation/blocs/tabs_container_bloc/tabs_container_bloc.dart';
import 'package:keklist/presentation/blocs/tabs_container_bloc/tabs_container_state.dart';
import 'package:keklist/presentation/blocs/user_profile_bloc/user_profile_bloc.dart';
import 'package:provider/provider.dart';
import 'package:streaming_shared_preferences/streaming_shared_preferences.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:keklist/presentation/blocs/auth_bloc/auth_bloc.dart';
import 'package:flutter/foundation.dart';
Expand Down Expand Up @@ -49,9 +52,12 @@ Future<void> main() async {
await _initHive();
await _initSupabase();

final StreamingSharedPreferences streamingSharedPreferences = await StreamingSharedPreferences.instance;

// Инициализация DI-контейнера.
final Injector injector = Injector();
final Injector mainInjector = MainContainer().initialize(injector);
final Injector mainInjector =
MainContainer(streamingSharedPreferences: streamingSharedPreferences).initialize(injector);

_connectToWatchCommunicationManager(mainInjector);
_enableDebugBLOCLogs();
Expand Down Expand Up @@ -127,7 +133,9 @@ Widget _getApplication(Injector mainInjector) => MultiProvider(
),
),
BlocProvider(
create: (context) => TabContainerBloc(),
create: (context) => TabsContainerBloc(
repository: mainInjector.get<TabsSettingsRepository>(),
),
),
],
child: const KeklistApp(),
Expand All @@ -141,7 +149,7 @@ void _initNativeWidgets() {
void _setupBlockingLoadingWidget() {
EasyLoading.instance
..displayDuration = const Duration(milliseconds: 10000)
..indicatorType = EasyLoadingIndicatorType.doubleBounce
..indicatorType = EasyLoadingIndicatorType.pouringHourGlass
..loadingStyle = EasyLoadingStyle.light
..indicatorSize = 45.0
..radius = 10.0
Expand Down
Loading
Loading