mirror of
https://github.com/foss42/apidash.git
synced 2025-10-20 13:14:49 +08:00
Feat: Brand new introduction page
This commit is contained in:
31
assets/intro.md
Normal file
31
assets/intro.md
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# Welcome to API Dash ⚡️
|
||||||
|
|
||||||
|
#br
|
||||||
|
|
||||||
|
API Dash is a beautiful open-source cross-platform API Client built using Flutter which can help you easily create & customize your API requests, visually inspect responses and generate Dart code on the go.
|
||||||
|
|
||||||
|
Please support this project by giving us a ~`Star on GitHub`~
|
||||||
|
|
||||||
|
#br
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
#br
|
||||||
|
|
||||||
|
Click on the ~`+ New`~ button to start drafting a new API request.
|
||||||
|
|
||||||
|
#br
|
||||||
|
|
||||||
|
## Support Channel
|
||||||
|
|
||||||
|
#br
|
||||||
|
|
||||||
|
Join our ~`Discord Server`~ and drop a message in the #foss channel.
|
||||||
|
|
||||||
|
#br
|
||||||
|
|
||||||
|
## Report Bug / Request New Feature
|
||||||
|
|
||||||
|
#br
|
||||||
|
|
||||||
|
Just raise an issue in our ~`Github Repo`~
|
@ -1,27 +1,16 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
||||||
import 'package:apidash/providers/providers.dart';
|
|
||||||
import 'package:apidash/widgets/widgets.dart';
|
import 'package:apidash/widgets/widgets.dart';
|
||||||
|
|
||||||
class IntroPage extends ConsumerWidget {
|
class IntroPage extends StatefulWidget {
|
||||||
const IntroPage({super.key});
|
const IntroPage({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
State<IntroPage> createState() => _IntroPageState();
|
||||||
final isDarkMode =
|
}
|
||||||
ref.watch(settingsProvider.select((value) => value.isDark));
|
|
||||||
|
|
||||||
return Scaffold(
|
class _IntroPageState extends State<IntroPage> {
|
||||||
body: IntroMessage(
|
@override
|
||||||
isDarkMode: isDarkMode,
|
Widget build(BuildContext context) {
|
||||||
onNew: () {
|
return const IntroMessage();
|
||||||
ref.read(collectionStateNotifierProvider.notifier).add();
|
|
||||||
},
|
|
||||||
onModeToggle: () async {
|
|
||||||
var mode = ref.read(settingsProvider).isDark;
|
|
||||||
await ref.read(settingsProvider.notifier).update(isDark: !mode);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,19 +1,13 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:flutter/services.dart' show rootBundle;
|
||||||
import 'package:apidash/consts.dart';
|
import 'markdown.dart';
|
||||||
|
import 'error_message.dart';
|
||||||
|
|
||||||
class IntroMessage extends StatefulWidget {
|
class IntroMessage extends StatefulWidget {
|
||||||
const IntroMessage({
|
const IntroMessage({
|
||||||
super.key,
|
super.key,
|
||||||
required this.isDarkMode,
|
|
||||||
this.onNew,
|
|
||||||
this.onModeToggle,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
final bool isDarkMode;
|
|
||||||
final void Function()? onNew;
|
|
||||||
final void Function()? onModeToggle;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<IntroMessage> createState() => _IntroMessageState();
|
State<IntroMessage> createState() => _IntroMessageState();
|
||||||
}
|
}
|
||||||
@ -21,224 +15,20 @@ class IntroMessage extends StatefulWidget {
|
|||||||
class _IntroMessageState extends State<IntroMessage> {
|
class _IntroMessageState extends State<IntroMessage> {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Padding(
|
final Future<String> intro = rootBundle.loadString('assets/intro.md');
|
||||||
padding: const EdgeInsets.symmetric(
|
|
||||||
vertical: 40,
|
return FutureBuilder(
|
||||||
horizontal: 60,
|
future: intro,
|
||||||
),
|
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
|
||||||
child: ListView(
|
if ((snapshot.connectionState == ConnectionState.done) &&
|
||||||
children: [
|
snapshot.hasData) {
|
||||||
Row(
|
return CustomMarkdown(data: snapshot.data!);
|
||||||
children: [
|
}
|
||||||
Expanded(
|
if (snapshot.hasError) {
|
||||||
child: Text(
|
return const ErrorMessage(message: "An error occured");
|
||||||
"Welcome to API Dash ⚡️",
|
}
|
||||||
style: Theme.of(context).textTheme.headlineLarge,
|
return const CircularProgressIndicator();
|
||||||
),
|
},
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
kVSpacer20,
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Text(
|
|
||||||
kIntro,
|
|
||||||
style: Theme.of(context).textTheme.titleMedium,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
kVSpacer10,
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Text.rich(
|
|
||||||
TextSpan(
|
|
||||||
children: [
|
|
||||||
TextSpan(
|
|
||||||
text: "Please support this project by giving us a ",
|
|
||||||
style: Theme.of(context).textTheme.titleMedium,
|
|
||||||
),
|
|
||||||
WidgetSpan(
|
|
||||||
alignment: PlaceholderAlignment.middle,
|
|
||||||
child: FilledButton.icon(
|
|
||||||
onPressed: () {
|
|
||||||
launchUrl(Uri.parse(kGitUrl));
|
|
||||||
},
|
|
||||||
icon: const Icon(Icons.star),
|
|
||||||
label: const Text(
|
|
||||||
'Star on GitHub',
|
|
||||||
style: kTextStyleButton,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
kVSpacer20,
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Text(
|
|
||||||
"Getting Started",
|
|
||||||
style: Theme.of(context).textTheme.headlineSmall,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
kVSpacer20,
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Text.rich(
|
|
||||||
TextSpan(
|
|
||||||
children: [
|
|
||||||
TextSpan(
|
|
||||||
text: "Click on the ",
|
|
||||||
style: Theme.of(context).textTheme.titleMedium,
|
|
||||||
),
|
|
||||||
WidgetSpan(
|
|
||||||
alignment: PlaceholderAlignment.middle,
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: widget.onNew,
|
|
||||||
child: const Text(
|
|
||||||
kLabelPlusNew,
|
|
||||||
style: kTextStyleButton,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
TextSpan(
|
|
||||||
text: " button to start drafting a new API request.",
|
|
||||||
style: Theme.of(context).textTheme.titleMedium,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
kVSpacer10,
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Text.rich(
|
|
||||||
TextSpan(
|
|
||||||
children: [
|
|
||||||
const TextSpan(
|
|
||||||
text: "Choose your theme now: ",
|
|
||||||
),
|
|
||||||
WidgetSpan(
|
|
||||||
alignment: PlaceholderAlignment.middle,
|
|
||||||
child: ElevatedButton.icon(
|
|
||||||
onPressed: widget.onModeToggle,
|
|
||||||
icon: widget.isDarkMode
|
|
||||||
? const Icon(Icons.dark_mode)
|
|
||||||
: const Icon(Icons.light_mode),
|
|
||||||
label: Text(
|
|
||||||
widget.isDarkMode ? "Dark" : "Light",
|
|
||||||
style: kTextStyleButton,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
style: Theme.of(context).textTheme.titleMedium,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
kVSpacer20,
|
|
||||||
kVSpacer10,
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Text(
|
|
||||||
"Support Channel",
|
|
||||||
style: Theme.of(context).textTheme.headlineSmall,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
kVSpacer20,
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Text.rich(
|
|
||||||
TextSpan(
|
|
||||||
children: [
|
|
||||||
TextSpan(
|
|
||||||
text: "Join our ",
|
|
||||||
style: Theme.of(context).textTheme.titleMedium,
|
|
||||||
),
|
|
||||||
WidgetSpan(
|
|
||||||
alignment: PlaceholderAlignment.middle,
|
|
||||||
child: FilledButton.icon(
|
|
||||||
onPressed: () {
|
|
||||||
launchUrl(Uri.parse(kDiscordUrl));
|
|
||||||
},
|
|
||||||
icon: const Icon(Icons.discord),
|
|
||||||
label: const Text(
|
|
||||||
'Discord Server',
|
|
||||||
style: kTextStyleButton,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
TextSpan(
|
|
||||||
text: " and drop a message in the #foss channel.",
|
|
||||||
style: Theme.of(context).textTheme.titleMedium,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
kVSpacer20,
|
|
||||||
kVSpacer10,
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Text(
|
|
||||||
"Report Bug / Request New Feature",
|
|
||||||
style: Theme.of(context).textTheme.headlineSmall,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
kVSpacer20,
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Text.rich(
|
|
||||||
TextSpan(
|
|
||||||
children: [
|
|
||||||
TextSpan(
|
|
||||||
text: "Just raise an issue in our ",
|
|
||||||
style: Theme.of(context).textTheme.titleMedium,
|
|
||||||
),
|
|
||||||
WidgetSpan(
|
|
||||||
alignment: PlaceholderAlignment.middle,
|
|
||||||
child: FilledButton.icon(
|
|
||||||
onPressed: () {
|
|
||||||
launchUrl(Uri.parse(kGitUrl));
|
|
||||||
},
|
|
||||||
icon: const Icon(Icons.code_rounded),
|
|
||||||
label: const Text(
|
|
||||||
'Github Repo',
|
|
||||||
style: kTextStyleButton,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user