Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
47 changes: 40 additions & 7 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,20 +1,53 @@
# Ignore build artifacts
build
# Ignore all build artifacts
build/
# But keep the release APK
!build/app/outputs/flutter-apk/app-release.apk
!build/app/outputs/flutter-apk/

# Dart/Flutter
.dart_tool
.idea
.vscode
.flutter-plugins
.flutter-plugins-dependencies
.packages
pubspec.lock

# Android / iOS build cache
# Android build cache
android/.gradle/
android/app/build/
android/.gradle
android/app/build
android/local.properties
android/**/*.iml

# iOS
ios/Pods/
ios/build/
ios/.symlinks/
ios/Pods
ios/build
ios/.symlinks

# IDEs
.idea/
.vscode/
.idea
.vscode
*.iml

# System files
.DS_Store
**/.DS_Store

# Git files
.git
# Git
.git/
.gitignore
.git
README.md

# Gradle cache
.gradle/
**/.gradle/

# Other large directories
node_modules/
coverage/
24 changes: 1 addition & 23 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -21,29 +21,7 @@ RUN sdkmanager \



# ---------------- LINT STAGE ----------------
FROM base AS lint
WORKDIR /app

COPY pubspec.* ./
RUN flutter pub get

COPY . .
RUN flutter analyze || true


# ---------------- TEST STAGE ----------------
FROM lint AS test
WORKDIR /app

# Run unit/widget tests
RUN flutter test --no-pub

# --------------- E2E TEST ---------------------
FROM base AS e2e
RUN flutter test integration_test || true


# ---------------- BUILD APK STAGE ----------------
FROM base AS build-apk
RUN flutter build apk --release
RUN flutter build apk --release --target-platform android-arm64
11 changes: 11 additions & 0 deletions lib/core/routes/AppRouter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import 'package:lite_x/features/chat/view/screens/conversations_screen.dart';
import 'package:lite_x/features/explore/view/explore_screen.dart';
import 'package:lite_x/features/home/models/tweet_model.dart';
import 'package:lite_x/features/home/view/screens/quote_composer_screen.dart';
import 'package:lite_x/features/profile/view/widgets/profile_tweets/likers_retweeters_screen.dart';
import 'package:lite_x/features/trends/view/screens/explore_screen.dart';
import 'package:lite_x/features/trends/view/screens/shatag_tweets_screen.dart';
import 'package:lite_x/features/trends/view/screens/trends_screen.dart';
Expand Down Expand Up @@ -488,6 +489,16 @@ class Approuter {
transitionsBuilder: _slideRightTransitionBuilder,
),
),
GoRoute(
name: RouteConstants.LikersRetweetersScreen,
path: "/likersRetweetersScreen/:tweetId",
pageBuilder: (context, state) => CustomTransitionPage(
child: LikersRetweetersScreen(
tweetId: state.pathParameters["tweetId"] as String,
),
transitionsBuilder: _slideRightTransitionBuilder,
),
),
],
redirect: (context, state) {
return null;
Expand Down
1 change: 1 addition & 0 deletions lib/core/routes/Route_Constants.dart
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,5 @@ class RouteConstants {
static String WhoToFollowScreen = "WhoToFollowScreen";
static String notifications = "notifications";
static String MentionedTweetsScreen = "MentionedTweetsScreen";
static String LikersRetweetersScreen = "LikersRetweetersScreen";
}
3 changes: 3 additions & 0 deletions lib/features/home/view/screens/create_post_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import 'package:lite_x/features/home/services/hashtag_service.dart';
import 'package:lite_x/features/home/view/widgets/hashtag_suggestions_overlay.dart';
import 'package:lite_x/features/home/view/widgets/mention_suggestion_overlay.dart';
import 'package:lite_x/features/home/models/user_suggestion.dart';
import 'package:lite_x/features/profile/view_model/providers.dart';

enum PostPrivacy {
everyone,
Expand Down Expand Up @@ -142,6 +143,8 @@ class _CreatePostScreenState extends ConsumerState<CreatePostScreen> {
_textController.clear();
_selectedMedia.clear();
});
if (mounted)
ref.refresh(profilePostsProvider(ref.read(myUserNameProvider)));
Navigator.pop(context, true);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
Expand Down
5 changes: 4 additions & 1 deletion lib/features/home/view/screens/home_screen.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:lite_x/core/providers/current_user_provider.dart';
import 'package:lite_x/core/view/screen/app_shell.dart';
import 'package:lite_x/features/home/models/tweet_model.dart';
Expand Down Expand Up @@ -394,7 +395,9 @@ class _HomeScreenState extends ConsumerState<HomeScreen>
ref.read(homeViewModelProvider.notifier).toggleLike(tweet.id);
},
onShare: () {},
onReach: () {},
onReach: () {
context.push("/likersRetweetersScreen/${tweet.id}");
},
onSave: () {
ref.read(homeViewModelProvider.notifier).toggleBookmark(tweet.id);
},
Expand Down
33 changes: 12 additions & 21 deletions lib/features/home/view/screens/reply_thread_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -570,13 +570,12 @@ class _ReplyThreadScreenState extends ConsumerState<ReplyThreadScreen> {
hashtag,
);
if (matchingHashtag != null) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => TempHashtagScreen(
hashtagId: matchingHashtag.id,
hashtagText: matchingHashtag.tagText,
),
),
context.push(
"/hashtagTweetsScreen",
extra: [
matchingHashtag.id,
matchingHashtag.tagText,
],
);
}
},
Expand Down Expand Up @@ -710,13 +709,9 @@ class _ReplyThreadScreenState extends ConsumerState<ReplyThreadScreen> {
hashtag,
);
if (matchingHashtag != null) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => TempHashtagScreen(
hashtagId: matchingHashtag.id,
hashtagText: matchingHashtag.tagText,
),
),
context.push(
"/hashtagTweetsScreen",
extra: [matchingHashtag.id, matchingHashtag.tagText],
);
}
},
Expand Down Expand Up @@ -820,13 +815,9 @@ class _ReplyThreadScreenState extends ConsumerState<ReplyThreadScreen> {
hashtag,
);
if (matchingHashtag != null) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => TempHashtagScreen(
hashtagId: matchingHashtag.id,
hashtagText: matchingHashtag.tagText,
),
),
context.push(
"/hashtagTweetsScreen",
extra: [matchingHashtag.id, matchingHashtag.tagText],
);
}
},
Expand Down
11 changes: 2 additions & 9 deletions lib/features/home/view/screens/tweet_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:go_router/go_router.dart';
import 'package:intl/intl.dart';
import 'package:lite_x/core/providers/current_user_provider.dart';
import 'package:lite_x/features/home/models/tweet_model.dart';
Expand Down Expand Up @@ -78,15 +79,7 @@ class _TweetDetailScreenState extends ConsumerState<TweetDetailScreen> {

void _openHashtagPosts({required String hashtagId, required String tagText}) {
try {
print(
'🏷️ Opening temp hashtag screen: id="$hashtagId", text="$tagText"',
);
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) =>
TempHashtagScreen(hashtagId: hashtagId, hashtagText: tagText),
),
);
context.push("/hashtagTweetsScreen", extra: [hashtagId, tagText]);
} catch (e, stackTrace) {
print('❌ Error opening hashtag screen: $e');
print('Stack trace: $stackTrace');
Expand Down
7 changes: 5 additions & 2 deletions lib/features/home/view/widgets/tweet_widget.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:lite_x/features/profile/view/screens/profile_screen.dart';
import 'package:lite_x/features/profile/view_model/providers.dart';
import 'expandable_text.dart';
import 'media_gallery.dart';
import '../../models/tweet_model.dart';

class TweetWidget extends StatelessWidget {
class TweetWidget extends ConsumerWidget {
final String userDisplayName;
final String username;
final String timeAgo;
Expand Down Expand Up @@ -84,7 +87,7 @@ class TweetWidget extends StatelessWidget {
});

@override
Widget build(BuildContext context) {
Widget build(BuildContext context, WidgetRef ref) {
return InkWell(
onTap: onTap,
child: Container(
Expand Down
37 changes: 19 additions & 18 deletions lib/features/profile/models/shared.dart
Original file line number Diff line number Diff line change
Expand Up @@ -625,10 +625,6 @@ class _InterActionsRowOfTweetState
ref.refresh(
profilePostsProvider(widget.tweet.userUserName),
);
final currUser = ref.watch(currentUserProvider);
if (currUser != null) {
ref.refresh(profilePostsProvider(currUser.username));
}
}
},
);
Expand Down Expand Up @@ -672,21 +668,26 @@ class _InterActionsRowOfTweetState
onTap: () {
// TODO: do activity action
},
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SvgPicture.asset(
"assets/svg/activity.svg",
width: 20,
height: 20,
colorFilter: ColorFilter.mode(Colors.grey, BlendMode.srcIn),
),
if (widget.tweet.activityNumber > 0)
Text(
Shared.formatCount(widget.tweet.activityNumber),
style: TextStyle(color: Colors.grey, fontSize: 15),
child: GestureDetector(
onTap: () {
context.push("/likersRetweetersScreen/${widget.tweet.id}");
},
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SvgPicture.asset(
"assets/svg/activity.svg",
width: 20,
height: 20,
colorFilter: ColorFilter.mode(Colors.grey, BlendMode.srcIn),
),
],
if (widget.tweet.activityNumber > 0)
Text(
Shared.formatCount(widget.tweet.activityNumber),
style: TextStyle(color: Colors.grey, fontSize: 15),
),
],
),
),
),
Row(
Expand Down
3 changes: 3 additions & 0 deletions lib/features/profile/repositories/profile_repo.dart
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ abstract class ProfileRepo {
String username,
);

Future<Either<Failure, List<UserModel>>> getRetweeters(String tweetId);
Future<Either<Failure, List<UserModel>>> getLikers(String tweetId);

Future<Either<Failure, ProfileTweetModel>> getProfileTweet(String tweetId);
Future<Either<Failure, void>> createTweet(CreateTweetModel createTweetModel);
Future<Either<Failure, List<TweetReplyModel>>> getTweetReplies(
Expand Down
Loading
Loading