appgram_flutter 1.0.0
appgram_flutter: ^1.0.0 copied to clipboard
Flutter SDK for Appgram - Feature voting, roadmaps, changelogs, help center, support tickets, status pages, surveys, contact forms, and blog. Build complete user feedback and support systems with pre- [...]
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:appgram_flutter/appgram_flutter.dart';
void main() {
runApp(
AppgramProvider(
config: const AppgramConfig(
projectId: '8be98cbb-308e-4aaa-8201-4fa17d5f2116',
orgSlug: 'acme-corp',
projectSlug: 'my-app',
),
theme: const AppgramThemeData(
mode: AppgramThemeMode.system,
),
child: const MyApp(),
),
);
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Appgram Flutter Example',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.indigo),
useMaterial3: true,
),
darkTheme: ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.indigo,
brightness: Brightness.dark,
),
useMaterial3: true,
),
home: const HomePage(),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return Scaffold(
appBar: AppBar(
title: const Text('Appgram SDK Demo'),
centerTitle: true,
),
body: ListView(
padding: const EdgeInsets.all(16),
children: [
// Header
Padding(
padding: const EdgeInsets.only(bottom: 24, top: 8),
child: Column(
children: [
Text(
'Appgram SDK Demo',
style: theme.textTheme.headlineMedium?.copyWith(
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
const SizedBox(height: 8),
Text(
'Flutter SDK for feature voting, roadmaps, help center, and more',
style: theme.textTheme.bodyMedium?.copyWith(
color: theme.colorScheme.onSurface.withValues(alpha: 0.7),
),
textAlign: TextAlign.center,
),
],
),
),
_FeatureCard(
title: 'Feature Wishes',
description: 'Vote on features and submit requests',
icon: Icons.lightbulb_outline,
onTap: () => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const WishListPage()),
),
),
_FeatureCard(
title: 'Roadmap',
description: 'See what we\'re building',
icon: Icons.view_kanban,
onTap: () => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const RoadmapPage()),
),
),
_FeatureCard(
title: 'Changelog',
description: 'See what\'s new',
icon: Icons.new_releases_outlined,
onTap: () => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const ReleasesPage()),
),
),
_FeatureCard(
title: 'Blog',
description: 'Read articles and updates',
icon: Icons.article_outlined,
onTap: () => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const BlogPage()),
),
),
_FeatureCard(
title: 'Help Center',
description: 'Browse help articles',
icon: Icons.help_outline,
onTap: () => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const HelpCenterPage()),
),
),
_FeatureCard(
title: 'Support',
description: 'Submit a support ticket',
icon: Icons.support_agent,
onTap: () => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const SupportPage()),
),
),
_FeatureCard(
title: 'Status',
description: 'Check system status',
icon: Icons.monitor_heart_outlined,
onTap: () => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const StatusPage()),
),
),
_FeatureCard(
title: 'Survey',
description: 'Give us feedback',
icon: Icons.poll_outlined,
onTap: () => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const SurveyPage()),
),
),
],
),
);
}
}
class _FeatureCard extends StatelessWidget {
const _FeatureCard({
required this.title,
required this.description,
required this.icon,
required this.onTap,
});
final String title;
final String description;
final IconData icon;
final VoidCallback onTap;
@override
Widget build(BuildContext context) {
return Card(
margin: const EdgeInsets.only(bottom: 12),
child: ListTile(
leading: Icon(icon, size: 32),
title: Text(title),
subtitle: Text(description),
trailing: const Icon(Icons.chevron_right),
onTap: onTap,
),
);
}
}
// Feature Voting Page
class WishListPage extends StatelessWidget {
const WishListPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Feature Requests')),
body: WishList(
onWishTap: (wish) {
WishDetailModal.show(context, wish: wish);
},
),
floatingActionButton: FloatingActionButton(
onPressed: () {
SubmitWishSheet.show(context);
},
child: const Icon(Icons.add),
),
);
}
}
// Roadmap Page
class RoadmapPage extends StatelessWidget {
const RoadmapPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Roadmap')),
body: const RoadmapBoard(),
);
}
}
// Releases Page
class ReleasesPage extends StatelessWidget {
const ReleasesPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Changelog')),
body: ReleaseList(
onReleaseTap: (release) {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => Scaffold(
appBar: AppBar(title: Text(release.title)),
body: ReleaseDetail(slug: release.slug),
),
),
);
},
),
);
}
}
// Help Center Page
class HelpCenterPage extends StatelessWidget {
const HelpCenterPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Help Center')),
body: HelpCenter(
onFlowTap: (flow) {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => Scaffold(
appBar: AppBar(title: Text(flow.name)),
body: HelpFlowDetail(
slug: flow.slug,
onArticleTap: (article) {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => Scaffold(
appBar: AppBar(title: Text(article.title)),
body: HelpArticleDetail(
slug: article.slug,
flowId: flow.id,
),
),
),
);
},
),
),
),
);
},
),
);
}
}
// Support Page
class SupportPage extends StatelessWidget {
const SupportPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Support')),
body: SupportForm(
onSubmitted: (request) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Support request submitted!')),
);
Navigator.pop(context);
},
),
);
}
}
// Status Page
class StatusPage extends StatelessWidget {
const StatusPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Service Status')),
body: const StatusBoard(
refreshInterval: Duration(minutes: 5),
),
);
}
}
// Blog Page
class BlogPage extends StatelessWidget {
const BlogPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Blog')),
body: BlogList(
onPostTap: (post) {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => Scaffold(
appBar: AppBar(title: Text(post.title)),
body: BlogPostDetail(
slug: post.slug,
onRelatedPostTap: (relatedPost) {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (_) => Scaffold(
appBar: AppBar(title: Text(relatedPost.title)),
body: BlogPostDetail(slug: relatedPost.slug),
),
),
);
},
),
),
),
);
},
),
);
}
}
// Survey Page
class SurveyPage extends StatelessWidget {
const SurveyPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Survey')),
body: SurveyForm(
slug: 'survey-feature-feedback',
onComplete: (response) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Survey submitted! Thank you for your feedback.')),
);
Navigator.pop(context);
},
),
);
}
}