Skip to content
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

feat: post image widget #11

Merged
merged 4 commits into from
Feb 9, 2024
Merged
Show file tree
Hide file tree
Changes from 3 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
3 changes: 2 additions & 1 deletion android/gradle.properties
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
org.gradle.jvmargs=-Xmx1536M
org.gradle.jvmargs=-Xmx8192m
org.gradle.parallel=true
ice-hector marked this conversation as resolved.
Show resolved Hide resolved
android.useAndroidX=true
android.enableJetifier=true
4 changes: 2 additions & 2 deletions lib/app/features/core/providers/template_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import 'package:riverpod_annotation/riverpod_annotation.dart';

part 'template_provider.g.dart';

Template? _template;
late Template _template;

//TODO::discuss this approach
Template get appTemplate {
return _template!;
return _template;
}

@Riverpod(keepAlive: true)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import 'package:flutter/material.dart';
import 'package:ice/app/extensions/build_context.dart';
import 'package:ice/app/extensions/theme_data.dart';
import 'package:ice/app/shared/widgets/screen_side_offset/screen_side_offset.dart';

class ArticleHeader extends StatelessWidget {
const ArticleHeader({
super.key,
required this.headerText,
this.isMainHeader = false,
});

final String headerText;
final bool isMainHeader;

TextStyle getStyle(BuildContext context) {
final Color color = context.theme.appColors.feedText;
if (isMainHeader) {
return context.theme.appTextThemes.headline2.copyWith(color: color);
}
return context.theme.appTextThemes.title.copyWith(color: color);
}

@override
Widget build(BuildContext context) {
return ScreenSideOffset.small(
child: Text(
headerText,
style: getStyle(context),
),
);
}
}
31 changes: 31 additions & 0 deletions lib/app/features/feed/widgets/article_header/widgetbook.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import 'package:flutter/material.dart';
import 'package:ice/app/features/feed/widgets/article_header/article_header.dart';
import 'package:widgetbook/widgetbook.dart';
import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook;

@widgetbook.UseCase(
name: 'article header',
type: ArticleHeader,
)
Widget plainArticleHeader(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ArticleHeader(
headerText: context.knobs.string(
label: 'Article Header',
initialValue:
'Coinbase Launches USDC Yields for Global Customers Amid US Crackdown',
),
isMainHeader: true,
),
ArticleHeader(
headerText: context.knobs.string(
label: 'Article Header',
initialValue:
'In 22 years, AI will perform 50% of work tasks, These are the results of McKinsey study',
),
),
],
);
}
81 changes: 81 additions & 0 deletions lib/app/features/feed/widgets/post_image/post_image.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:ice/app/extensions/build_context.dart';
import 'package:ice/app/extensions/theme_data.dart';
import 'package:ice/app/features/feed/widgets/read_time_tile/read_time_tile.dart';
import 'package:ice/app/shared/widgets/screen_side_offset/screen_side_offset.dart';
import 'package:ice/utils/Image_utils.dart';

double borderRadius = 12.0.w;

class PostImage extends StatelessWidget {
const PostImage({
super.key,
required this.imageUrl,
this.minutesToRead,
this.minutesToReadAlignment,
});

final String imageUrl;
final int? minutesToRead;
final Alignment? minutesToReadAlignment;

BorderRadius getOverlayBorderRadius(Alignment alignment) {
if (alignment == Alignment.bottomRight || alignment == Alignment.topLeft) {
return BorderRadius.only(
topLeft: Radius.circular(borderRadius),
bottomRight: Radius.circular(borderRadius),
);
}
if (alignment == Alignment.topRight || alignment == Alignment.bottomLeft) {
return BorderRadius.only(
topRight: Radius.circular(borderRadius),
bottomLeft: Radius.circular(borderRadius),
);
}
return BorderRadius.all(Radius.circular(borderRadius));
}

@override
Widget build(BuildContext context) {
final double paddingHorizontal = ScreenSideOffset.defaultSmallMargin;
final double imageWidth =
MediaQuery.of(context).size.width - paddingHorizontal * 2;

final Alignment alignment = minutesToReadAlignment ?? Alignment.bottomRight;

return Padding(
padding: EdgeInsets.symmetric(horizontal: paddingHorizontal),
child: ClipRRect(
borderRadius: BorderRadius.circular(borderRadius),
child: Stack(
alignment: alignment,
children: <Widget>[
CachedNetworkImage(
imageUrl: ImageUtils.getAdaptiveImageUrl(imageUrl, imageWidth),
width: imageWidth,
fit: BoxFit.cover,
),
if (minutesToRead != null) ...<Widget>[
Container(
padding:
EdgeInsets.symmetric(horizontal: 8.0.w, vertical: 4.0.w),
decoration: BoxDecoration(
color: context.theme.appColors.tertararyBackground,
border: Border.all(
color: context.theme.appColors.onTerararyFill,
),
borderRadius: getOverlayBorderRadius(alignment),
),
child: ReadTimeTile(
minutesToRead: minutesToRead!,
),
),
],
],
),
),
);
}
}
27 changes: 27 additions & 0 deletions lib/app/features/feed/widgets/post_image/widgetbook.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
import 'package:ice/app/features/feed/widgets/post_image/post_image.dart';
import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook;

@widgetbook.UseCase(
name: 'base case',
type: PostImage,
)
Widget baseUseCase(BuildContext context) {
return const PostImage(
imageUrl:
'https://ice.io/wp-content/uploads/2023/03/Pre-Release-600x403.png',
);
}

@widgetbook.UseCase(
name: 'with read time overlay',
type: PostImage,
)
Widget withReadTimeUseCase(BuildContext context) {
return const PostImage(
imageUrl:
'https://ice.io/wp-content/uploads/2023/03/Pre-Release-600x403.png',
minutesToRead: 7,
minutesToReadAlignment: Alignment.topRight,
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:ice/app/extensions/build_context.dart';
import 'package:ice/app/extensions/theme_data.dart';

double iconSize = 16.0.w;

class ReadTimeTile extends StatelessWidget {
const ReadTimeTile({super.key, required this.minutesToRead});

final int minutesToRead;

@override
Widget build(BuildContext context) {
return Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(
Icons.access_time,
size: iconSize,
color: context.theme.appColors.feedText,
),
SizedBox(width: 3.0.w),
Text(
context.i18n.read_time_in_mins(minutesToRead),
style: context.theme.appTextThemes.caption
.copyWith(color: context.theme.appColors.feedText),
),
],
);
}
}
23 changes: 23 additions & 0 deletions lib/app/features/feed/widgets/read_time_tile/widgetbook.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import 'package:flutter/material.dart';
import 'package:ice/app/extensions/build_context.dart';
import 'package:ice/app/extensions/theme_data.dart';
import 'package:ice/app/features/feed/widgets/read_time_tile/read_time_tile.dart';
import 'package:widgetbook/widgetbook.dart';
import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook;

@widgetbook.UseCase(
name: 'base case',
type: ReadTimeTile,
)
Widget baseUseCase(BuildContext context) {
return ColoredBox(
color: context.theme.appColors.onTerararyFill,
child: ReadTimeTile(
minutesToRead: context.knobs.int.slider(
label: 'Minutes To Read',
initialValue: 7,
max: 120,
),
),
);
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';

double defaultLargeMargin = 44.0.w;
double defaultSmallMargin = 16.0.w;

class ScreenSideOffset extends StatelessWidget {
const ScreenSideOffset._({
super.key,
Expand Down Expand Up @@ -38,6 +35,11 @@ class ScreenSideOffset extends StatelessWidget {
child: child,
);
}

static double get defaultSmallMargin => 16.0.w;

static double get defaultLargeMargin => 44.0.w;

final Widget child;
final EdgeInsets insets;

Expand Down
6 changes: 4 additions & 2 deletions lib/app/shared/widgets/socials/socials.dart
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,10 @@ class _SocialsState extends State<Socials> {
final double buttonWidth = context.theme.iconButtonTheme.style?.iconSize
?.resolve(<MaterialState>{}) ??
defaultSocialIconButtonSide;
final double spaceBetweenButtons =
(screenWidth - 2 * defaultLargeMargin - 4 * buttonWidth) / 3;
final double spaceBetweenButtons = (screenWidth -
2 * ScreenSideOffset.defaultLargeMargin -
4 * buttonWidth) /
3;

return Column(
children: <Widget>[
Expand Down
58 changes: 48 additions & 10 deletions lib/app/templates/basic.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"primaryText": "#0E0E0E",
"secondaryText": "#494949",
"tertararyText": "#9A9A9A",
"feedText": "#333436",
"primaryBackground": "#F5F7FF",
"secondaryBackground": "#FFFFFF",
"tertararyBackground": "#FAFBFF",
Expand All @@ -23,6 +24,7 @@
"primaryText": "#0E0E0E",
"secondaryText": "#494949",
"tertararyText": "#9A9A9A",
"feedText": "#333436",
ice-hades marked this conversation as resolved.
Show resolved Hide resolved
"primaryBackground": "#F5F7FF",
"secondaryBackground": "#FFFFFF",
"tertararyBackground": "#FAFBFF",
Expand All @@ -38,16 +40,52 @@
}
},
"textThemes": {
"headline1": { "fontSize": 28, "fontWeight": 700 },
"inputFieldText": { "fontSize": 25, "fontWeight": 700 },
"title": { "fontSize": 17, "fontWeight": 500 },
"subtitle": { "fontSize": 15, "fontWeight": 600 },
"subtitle2": { "fontSize": 15, "fontWeight": 500 },
"body": { "fontSize": 13, "height": 1.38, "fontWeight": 600 },
"body2": { "fontSize": 13, "fontWeight": 400 },
"caption": { "fontSize": 12, "fontWeight": 500 },
"caption2": { "fontSize": 12, "fontWeight": 400 },
"caption3": { "fontSize": 11, "height": 1.63, "fontWeight": 400 }
"headline1": {
"fontSize": 28,
"fontWeight": 700
},
"headline2": {
"fontSize": 24,
"fontWeight": 700
},
"inputFieldText": {
"fontSize": 25,
"fontWeight": 700
},
"title": {
"fontSize": 17,
"fontWeight": 600
},
"subtitle": {
"fontSize": 15,
"fontWeight": 600
},
"subtitle2": {
"fontSize": 15,
"fontWeight": 500
},
"body": {
"fontSize": 13,
"height": 1.38,
"fontWeight": 600
},
"body2": {
"fontSize": 13,
"fontWeight": 400
},
"caption": {
"fontSize": 12,
"fontWeight": 500
},
"caption2": {
"fontSize": 12,
"fontWeight": 400
},
"caption3": {
"fontSize": 11,
"height": 1.63,
"fontWeight": 400
}
},
"appBar": {
"toolbarHeight": 50
Expand Down
5 changes: 5 additions & 0 deletions lib/app/templates/template.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ class TemplateColors {
this.primaryText,
this.secondaryText,
this.tertararyText,
this.feedText,
this.primaryBackground,
this.secondaryBackground,
this.tertararyBackground,
Expand All @@ -38,6 +39,8 @@ class TemplateColors {
@ColorConverter()
Color tertararyText;
@ColorConverter()
Color feedText;
@ColorConverter()
Color primaryBackground;
@ColorConverter()
Color secondaryBackground;
Expand Down Expand Up @@ -101,6 +104,7 @@ class TemplateTextTheme {
class TemplateTextThemes {
TemplateTextThemes(
this.headline1,
this.headline2,
this.inputFieldText,
this.title,
this.subtitle,
Expand All @@ -116,6 +120,7 @@ class TemplateTextThemes {
_$TemplateTextThemesFromJson(json);

TemplateTextTheme headline1;
TemplateTextTheme headline2;
TemplateTextTheme inputFieldText;
TemplateTextTheme title;
TemplateTextTheme subtitle;
Expand Down
Loading
Loading