smart_design_system 0.0.7 copy "smart_design_system: ^0.0.7" to clipboard
smart_design_system: ^0.0.7 copied to clipboard

Design system for SmartDash.

example/lib/main.dart

import 'dart:async';
import 'dart:developer';

import 'package:dartz/dartz.dart';
import 'package:flutter/material.dart';
import 'package:smart_design_system/generic_features/core/domain/entities/feature_initial_action.dart';
import 'package:smart_design_system/generic_features/core/domain/entities/feature_stream_event.dart';
import 'package:smart_design_system/generic_features/core/domain/repositories/smart_repository.dart';
import 'package:smart_design_system/generic_features/smart/smart_feature_builder.dart';
import 'package:smart_design_system/generic_features/submit/submit_feature_builder.dart';
import 'package:smart_design_system/theme/extensions/custom_theme.dart';
import 'package:smart_design_system/theme/theme_data/custom_text_styles.dart';

class MyTheme extends CustomTheme {
  @override
  CustomThemeExtension get themeExtension {
    return CustomThemeExtension(
      primary: Colors.blue,
      secondary: Colors.grey,
      success: Colors.green,
      danger: Colors.red,
      warning: Colors.orange,
      information: Colors.cyan,
      light: Colors.white,
      dark: Colors.black,
      textStyles: CustomTextStyles(
        h1: CustomTextStyle(value: const TextStyle(fontSize: 24), light: FontWeight.w300, strong: FontWeight.w700),
        h2: CustomTextStyle(value: const TextStyle(fontSize: 20)),
        h3: CustomTextStyle(value: const TextStyle(fontSize: 18)),
        h4: CustomTextStyle(value: const TextStyle(fontSize: 16)),
        h5: CustomTextStyle(value: const TextStyle(fontSize: 14)),
        h6: CustomTextStyle(value: const TextStyle(fontSize: 12)),
        title: CustomTextStyle(value: const TextStyle(fontSize: 18)),
      ),
    );
  }
}

void main() {
  runApp(const MainApp());
}

class MainApp extends StatelessWidget {
  const MainApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(extensions: [MyTheme().themeExtension]),
      title: 'Flutter Demo',
      home: ExamplePage(),
    );
  }
}

class MockPersonasRepository implements SmartRepository<void, List<String>> {
  @override
  Future<Either<SmartFailure, List<String>>> call(void data) async {
    await Future.delayed(const Duration(seconds: 2));
    return const Right(['Person 1', 'Person 2', 'Person 3']);
  }
}

class ExamplePage extends StatelessWidget {
  ExamplePage({super.key});

  final streamController = StreamController<FeatureStreamEvent>.broadcast();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Personas Page')),
      body: Column(
        children: [
          TextButton(
            onPressed: () => streamController.add(const FeatureStreamEvent.fetch(null)),
            child: const Text('Refresh'),
          ),
          Expanded(
            child: SmartFeatureBuilder.build<void, List<String>>(
              repository: () => MockPersonasRepository(),
              stream: streamController.stream,
              initialAction: const FeatureInitialAction.call(null),
              builder: (context, personas) {
                return Center(
                  child: ListView.builder(
                    itemCount: personas.length,
                    itemBuilder: (context, index) {
                      return ListTile(title: Text(personas[index]));
                    },
                  ),
                );
              },
            ),
          ),
        ],
      ),
    );
  }

  void _onPressed(BuildContext context) {
    SubmitFeatureBuilder.submitWithDialog<int, String>(
      repository: MockSubmitRepository(),
      context: context,
      isDismissible: true,
      onSuccess: (result) => log(result),
      data: 1,
    );
  }
}

class MockSubmitRepository implements SmartRepository<int, String> {
  @override
  Future<Either<SmartFailure, String>> call(int data) async {
    await Future.delayed(const Duration(seconds: 2));
    return Left(SmartFailure());
    // return const Right('Data submitted');
  }
}