stream24 0.1.11 copy "stream24: ^0.1.11" to clipboard
stream24: ^0.1.11 copied to clipboard

A flutter plugin for creating 24Stream Rich Page widgets.

example/lib/main.dart

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:stream24/stream24.dart';
import 'package:stream24_example/webview_page.dart';

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

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

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({
    super.key,
  });

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late TextEditingController retailerDomainController,
      brandController,
      productIdController,
      templateTypeController,
      languageController,
      pageController;
  bool throwError = true;
  Stream24ContentType contentType = Stream24ContentType.shopInShops;
  Stream24ResultType resultType = Stream24ResultType.html;
  List<RichPageTemplate> _templates = [];
  @override
  void initState() {
    super.initState();
    // SharedPreferences.getInstance().then((value) => value.clear());
    retailerDomainController = TextEditingController(text: 'irshad.az');
    brandController = TextEditingController(text: 'Samsung');
    productIdController = TextEditingController(text: '16651081549');
    templateTypeController = TextEditingController(text: 'master_template');
    pageController = TextEditingController(text: 'index.html');
    languageController = TextEditingController(text: 'ru');
    _fetchSavedTemplates();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: SingleChildScrollView(
          physics: ClampingScrollPhysics(),
          padding: const EdgeInsets.all(12.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: [
              TextField(
                decoration: const InputDecoration(labelText: "Retailer domain"),
                controller: retailerDomainController,
              ),
              TextField(
                decoration: const InputDecoration(labelText: "Brand"),
                controller: brandController,
              ),
              TextField(
                decoration: const InputDecoration(labelText: "Product ID"),
                controller: productIdController,
              ),
              TextField(
                decoration: const InputDecoration(labelText: "Language"),
                controller: languageController,
              ),
              TextField(
                decoration: const InputDecoration(labelText: "Template type"),
                controller: templateTypeController,
              ),
              DropdownButton<bool>(
                  value: throwError,
                  items: const [
                    DropdownMenuItem(
                      value: true,
                      child: Text(
                        'Throw error',
                      ),
                    ),
                    DropdownMenuItem(
                      value: false,
                      child: Text(
                        'Don\'t throw error',
                      ),
                    ),
                  ],
                  onChanged: (_throwError) {
                    setState(() {
                      throwError = _throwError!;
                    });
                  }),
              DropdownButton<Stream24ContentType>(
                  value: contentType,
                  items: const [
                    DropdownMenuItem(
                      value: Stream24ContentType.shopInShops,
                      child: Text(
                        'Shop in shops',
                      ),
                    ),
                    DropdownMenuItem(
                      value: Stream24ContentType.minisite,
                      child: Text(
                        'Minisite',
                      ),
                    ),
                  ],
                  onChanged: (type) {
                    setState(() {
                      contentType = type!;
                    });
                  }),
              DropdownButton<Stream24ResultType>(
                  value: resultType,
                  items: const [
                    DropdownMenuItem(
                      value: Stream24ResultType.html,
                      child: Text(
                        'html',
                      ),
                    ),
                    DropdownMenuItem(
                      value: Stream24ResultType.json,
                      child: Text(
                        'json',
                      ),
                    ),
                    DropdownMenuItem(
                      value: Stream24ResultType.iframe,
                      child: Text(
                        'iframe',
                      ),
                    ),
                  ],
                  onChanged: (type) {
                    setState(() {
                      resultType = type!;
                    });
                  }),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: [
                  Flexible(
                    child: TextButton(
                      onPressed: () async {
                        saveTemplate(RichPageTemplate(
                            brand: brandController.value.text,
                            retailerDomain: retailerDomainController.value.text,
                            productId: productIdController.value.text,
                            templateType: templateTypeController.value.text,
                            language: languageController.value.text,
                            page: pageController.value.text,
                            throwError: throwError,
                            contentType: contentType,
                            resultType: resultType));
                      },
                      child: Row(
                        children: [
                          Icon(Icons.save_rounded),
                          const Text("Save template"),
                        ],
                      ),
                      style: ButtonStyle(
                          foregroundColor:
                              MaterialStatePropertyAll<Color>(Colors.green)),
                    ),
                  ),
                  Flexible(
                    child: TextButton(
                      onPressed: () async {
                        Navigator.of(context).push(
                          MaterialPageRoute(
                            builder: (context) => WebViewPage(
                              brand: brandController.value.text,
                              productId: productIdController.value.text,
                              retailerDomain:
                                  retailerDomainController.value.text,
                              templateType: templateTypeController.value.text,
                              language: languageController.value.text,
                              contentType: contentType,
                            ),
                          ),
                        );
                      },
                      child: const Text("Open page"),
                      style: ButtonStyle(
                          foregroundColor:
                              MaterialStatePropertyAll<Color>(Colors.blue)),
                    ),
                  ),
                ],
              ),
              Divider(),
              Text(
                'Saved templates:',
                style: Theme.of(context).textTheme.titleMedium,
              ),
              // ListView(
              //   children: _templates.map((element) {
              //     return Container();
              //   }).toList(),
              // )
            ]..addAll(_templates.reversed.map((element) {
                return Container(
                  margin: EdgeInsets.all(10),
                  padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
                  decoration: BoxDecoration(
                      borderRadius: BorderRadius.circular(10),
                      color: Colors.white,
                      boxShadow: [
                        BoxShadow(color: Colors.grey, blurRadius: 5)
                      ]),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Text(element.brand),
                      Text(element.retailerDomain),
                      Text(element.productId),
                      Text(element.language),
                      Text(element.templateType),
                      // Text(element.page),
                      Text(element.throwError
                          ? 'Throw error'
                          : "Don't throw error"),
                      Text(element.contentType
                          .toString()
                          .replaceFirst('.', ': ')),
                      Text(element.resultType
                          .toString()
                          .replaceFirst('.', ': ')),
                      Row(
                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        children: [
                          TextButton(
                            onPressed: () async {
                              removeTemplate(element);
                            },
                            child: Row(
                              children: [
                                Icon(Icons.delete_forever),
                                const Text("Remove"),
                              ],
                            ),
                            style: ButtonStyle(
                              foregroundColor:
                                  MaterialStatePropertyAll<Color>(Colors.red),
                            ),
                          ),
                          TextButton(
                            onPressed: () async {
                              useTemplate(element);
                            },
                            child: Row(
                              children: [
                                Icon(Icons.check),
                                const Text("Apply"),
                              ],
                            ),
                            style: ButtonStyle(
                                foregroundColor:
                                    MaterialStatePropertyAll<Color>(
                                        Colors.blue)),
                          ),
                        ],
                      ),
                    ],
                  ),
                );
              }).toList()),
          ),
        ),
      ),
    );
  }

  saveTemplate(RichPageTemplate newTemplate) {
    if (_templates.contains(newTemplate)) {
      return;
    }
    _templates.add(newTemplate);
    setState(() {});
    saveTemplates();
  }

  Future saveTemplates() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setStringList(
        'templates', _templates.map((e) => e.toJson()).toList());
  }

  Future _fetchSavedTemplates() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    var jsonsList =
        prefs.containsKey('templates') ? prefs.getStringList('templates')! : [];
    for (var jsonString in jsonsList) {
      _templates.add(RichPageTemplate.fromJson(jsonString));
    }
    setState(() {});
  }

  void useTemplate(RichPageTemplate element) {
    setState(() {
      retailerDomainController.text = element.retailerDomain;
      brandController.text = element.brand;
      productIdController.text = element.productId;
      templateTypeController.text = element.templateType;
      pageController.text = element.page;
      languageController.text = element.language;
      throwError = element.throwError;
      contentType = element.contentType;
      resultType = element.resultType;
    });
  }

  void removeTemplate(RichPageTemplate element) {
    if (_templates.remove(element)) {
      setState(() {});
      saveTemplates();
    }
  }
}

class RichPageTemplate {
  String retailerDomain, brand, productId, templateType, language, page;
  bool throwError;
  Stream24ContentType contentType;
  Stream24ResultType resultType;
  RichPageTemplate({
    required this.brand,
    required this.retailerDomain,
    required this.productId,
    required this.templateType,
    required this.language,
    required this.page,
    required this.throwError,
    required this.contentType,
    required this.resultType,
  });
  //""{\"brand\":\"Samsung\",\"retailerDomain\":\"irshad.az\",\"productId\":\"16651081549\",\"templateType\":\"master_template\",\"la…"

  factory RichPageTemplate.fromJson(String jsonMap) {
    print(jsonMap);
    Map<String, dynamic> map = json.decode(jsonMap) as Map<String, dynamic>;
    return RichPageTemplate(
      brand: map['brand']!,
      retailerDomain: map['retailerDomain']!,
      productId: map['productId']!,
      templateType: map['templateType']!,
      language: map['language']!,
      page: map['page']!,
      throwError: map['throwError']! == 'true',
      contentType: _contentTypeMap[map['contentType']!]!,
      resultType: _resultTypeMap[map['resultType']!]!,
    );
  }

  static String _getContentType(Stream24ContentType contentType) {
    switch (contentType) {
      case Stream24ContentType.shopInShops:
        return 'sis';
      case Stream24ContentType.minisite:
        return 'minisite';
    }
  }

  static String _getResultType(Stream24ResultType resultType) {
    switch (resultType) {
      case Stream24ResultType.json:
        return 'json';
      case Stream24ResultType.html:
        return 'html';
      case Stream24ResultType.iframe:
        return 'iframe';
    }
  }

  static final Map<String, Stream24ContentType> _contentTypeMap = {
    'sis': Stream24ContentType.shopInShops,
    'minisite': Stream24ContentType.minisite,
  };
  static final Map<String, Stream24ResultType> _resultTypeMap = {
    'json': Stream24ResultType.json,
    'html': Stream24ResultType.html,
    'iframe': Stream24ResultType.iframe,
  };

  String toJson() {
    return json.encode({
      "brand": brand,
      "retailerDomain": retailerDomain,
      "productId": productId,
      "templateType": templateType,
      "language": language,
      "page": page,
      "throwError": throwError.toString(),
      "contentType": _getContentType(contentType),
      "resultType": _getResultType(resultType),
    });
  }

  @override
  bool operator ==(Object other) {
    if (other is! RichPageTemplate) return false;
    if (other.hashCode != hashCode) return false;
    if (brand != other.brand) return false;
    if (retailerDomain != other.retailerDomain) return false;
    if (productId != other.productId) return false;
    if (language != other.language) return false;
    if (templateType != other.templateType) return false;
    if (page != other.page) return false;
    if (throwError != other.throwError) return false;
    if (contentType != other.contentType) return false;
    if (resultType != other.resultType) return false;

    return true;
  }

  @override
  int get hashCode {
    var result = 1;
    result *= brand.hashCode *
        retailerDomain.hashCode *
        productId.hashCode *
        language.hashCode *
        templateType.hashCode *
        page.hashCode *
        throwError.hashCode *
        contentType.hashCode *
        resultType.hashCode;
    return result;
  }
}
1
likes
135
points
303
downloads

Publisher

unverified uploader

Weekly Downloads

A flutter plugin for creating 24Stream Rich Page widgets.

Homepage

Documentation

API reference

License

MIT (license)

Dependencies

flutter, flutter_inappwebview, http

More

Packages that depend on stream24

Packages that implement stream24