mirror of
https://github.com/feeddeck/feeddeck.git
synced 2026-05-10 04:07:39 -05:00
Prepare v1.0.0 Release (#12)
- Adjust "Release" section in contributing guide. - Disable "X" datasource, since it is not working after the latest API adjustments. - Update "version" key and "msix_config.msix_version" key in "pubspec.yaml" file. - Change user in "AddSourceReddit" widget help text. - Enable macOS App Sandbox. - Adjust logo for Windows version.
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
- [Run Release Build on a Device](#run-release-build-on-a-device)
|
||||
- [Working with Supabase](#working-with-supabase)
|
||||
- [Working with Deno](#working-with-deno)
|
||||
- [Hosting](#hosting)
|
||||
- [Release](#release)
|
||||
|
||||
Every contribution to FeedDeck is welcome, whether it is reporting a bug,
|
||||
@@ -63,9 +64,9 @@ Tools • Dart 2.19.6 • DevTools 2.20.1
|
||||
|
||||
|
||||
$ deno --version
|
||||
deno 1.33.1 (release, aarch64-apple-darwin)
|
||||
v8 11.4.183.1
|
||||
typescript 5.0.3
|
||||
deno 1.36.4 (release, aarch64-apple-darwin)
|
||||
v8 11.6.189.12
|
||||
typescript 5.1.6
|
||||
```
|
||||
|
||||
### Working with Flutter
|
||||
@@ -301,7 +302,7 @@ docker-compose up --build
|
||||
|
||||
## Hosting
|
||||
|
||||
FeedDeck uses Supabase as it backend. For Supabase we can use
|
||||
FeedDeck uses Supabase as backend. For Supabase we can use
|
||||
[Supabase Cloud](https://supabase.com/dashboard) or their
|
||||
[Self-Hosting](https://supabase.com/docs/guides/self-hosting) offer.
|
||||
|
||||
@@ -399,33 +400,37 @@ Android, macOS, Windows and Linux if you do not want to use the official ones.
|
||||
|
||||
## Release
|
||||
|
||||
```sh
|
||||
supabase link --project-ref <PROJECT-ID>
|
||||
supabase secrets set --env-file supabase/.env.prod
|
||||
supabase secrets list
|
||||
```
|
||||
1. Ensure that all secrets are updated in the Supabase project:
|
||||
|
||||
### Web
|
||||
```sh
|
||||
supabase link --project-ref <PROJECT-ID>
|
||||
supabase secrets set --env-file supabase/.env.prod
|
||||
supabase secrets list
|
||||
```
|
||||
|
||||
To create a new release for the web version, the following workflow can be used:
|
||||
2. Update the `version` key and the `msix_config.msix_version` key in the
|
||||
`pubspec.yaml` file.
|
||||
|
||||
1. Delete the `build/` and `.dart_tool/` directories: `flutter clean`
|
||||
3. Delete the `build/` and `.dart_tool/` directories via the `flutter clean`
|
||||
command.
|
||||
|
||||
2. Build a web application bundle:
|
||||
`flutter build web --dart-define SUPABASE_URL=<SUPABASE_URL> --dart-define SUPABASE_ANON_KEY=<SUPABASE_ANON_KEY> --dart-define SUPABASE_SITE_URL=<SUPABASE_SITE_URL> --dart-define GOOGLE_CLIENT_ID=<GOOGLE_CLIENT_ID>`
|
||||
4. Build the app for Web by running `flutter build web`. The build can be found
|
||||
at `app/build/web` and must be uploaded to your hosting provider.
|
||||
|
||||
3. Upload the `app/build/web` folder to your CDN.
|
||||
5. Build the app for Linux by running `flutter build linux --release`.
|
||||
|
||||
### macOS, Windows and Linux
|
||||
6. Build the app for macOS by running `flutter build macos --release`. Open
|
||||
Xcode and select **Product** > **Archive** to create and open the archive.
|
||||
After that the **Validate App** and **Distribute App** options can be used to
|
||||
upload the build to
|
||||
[https://appstoreconnect.apple.com](https://appstoreconnect.apple.com).
|
||||
|
||||
### iOS and Android
|
||||
7. Build the app for Windows by running `flutter build windows --release`. and
|
||||
`flutter pub run msix:create --output-path build --output-name feeddeck`. The
|
||||
build can be found at `app/build/feeddeck.msix` and must be uploaded to
|
||||
[https://partner.microsoft.com/en-us/dashboard/products/9NPHPGRRCT5H/overview](https://partner.microsoft.com/en-us/dashboard/products/9NPHPGRRCT5H/overview).
|
||||
|
||||
To create a new release for Android and iOS which can be published in
|
||||
[Google Play](https://play.google.com/store/apps/details?id=app.feeddeck.feeddeck)
|
||||
and the [App Store](https://apps.apple.com/us/app/FeedDeck/TODO) the following
|
||||
workflow can be used:
|
||||
|
||||
1. Create a file `app/android/key.properties` with the following content:
|
||||
8. Create a file `app/android/key.properties` with the following content:
|
||||
|
||||
```plain
|
||||
storePassword=
|
||||
@@ -434,20 +439,13 @@ workflow can be used:
|
||||
storeFile=
|
||||
```
|
||||
|
||||
2. Update the `version` key in the `pubspec.yaml` file
|
||||
|
||||
3. Delete all old builds by running `rm -rf build`
|
||||
|
||||
4. Build the app for Android by running
|
||||
`flutter build appbundle --dart-define SUPABASE_URL=<SUPABASE_URL> --dart-define SUPABASE_ANON_KEY=<SUPABASE_ANON_KEY> --dart-define SUPABASE_SITE_URL=<SUPABASE_SITE_URL> --dart-define GOOGLE_CLIENT_ID=<GOOGLE_CLIENT_ID>`.
|
||||
The build can be found at
|
||||
`app/build/app/outputs/bundle/release/app-release.aab` and must be uploaded
|
||||
to
|
||||
9. Build the app for Android by running `flutter build appbundle`. The build can
|
||||
be found at `app/build/app/outputs/bundle/release/app-release.aab` and must
|
||||
be uploaded to
|
||||
[https://play.google.com/apps/publish](https://play.google.com/apps/publish).
|
||||
|
||||
5. Build the app for iOS by running
|
||||
`flutter build ipa --dart-define SUPABASE_URL=<SUPABASE_URL> --dart-define SUPABASE_ANON_KEY=<SUPABASE_ANON_KEY> --dart-define SUPABASE_SITE_URL=<SUPABASE_SITE_URL> --dart-define GOOGLE_CLIENT_ID=<GOOGLE_CLIENT_ID>`.
|
||||
The build can be found at `app/build/ios/archive/Runner.xcarchive` and must
|
||||
be opened in Xcode. In Xcode **Validate App** and **Distribute App** can be
|
||||
used to upload the build to
|
||||
[https://appstoreconnect.apple.com](https://appstoreconnect.apple.com).
|
||||
10. Build the app for iOS by running `flutter build ipa`. The build can be found
|
||||
at `app/build/ios/archive/Runner.xcarchive` and must be opened in Xcode. In
|
||||
Xcode the **Validate App** and **Distribute App** options can be used to
|
||||
upload the build to
|
||||
[https://appstoreconnect.apple.com](https://appstoreconnect.apple.com).
|
||||
|
||||
@@ -6,6 +6,12 @@ if (localPropertiesFile.exists()) {
|
||||
}
|
||||
}
|
||||
|
||||
def keystoreProperties = new Properties()
|
||||
def keystorePropertiesFile = rootProject.file('key.properties')
|
||||
if (keystorePropertiesFile.exists()) {
|
||||
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
||||
}
|
||||
|
||||
def flutterRoot = localProperties.getProperty('flutter.sdk')
|
||||
if (flutterRoot == null) {
|
||||
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
|
||||
@@ -50,16 +56,23 @@ android {
|
||||
// minSdkVersion flutter.minSdkVersion
|
||||
// targetSdkVersion flutter.targetSdkVersion
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 31
|
||||
targetSdkVersion 33
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
release {
|
||||
keyAlias keystoreProperties['keyAlias']
|
||||
keyPassword keystoreProperties['keyPassword']
|
||||
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
|
||||
storePassword keystoreProperties['storePassword']
|
||||
}
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
// TODO: Add your own signing config for the release build.
|
||||
// Signing with the debug keys for now, so `flutter run --release` works.
|
||||
signingConfig signingConfigs.debug
|
||||
signingConfig signingConfigs.release
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,8 @@ PODS:
|
||||
- FMDB/standard (2.7.5)
|
||||
- just_audio (0.0.1):
|
||||
- Flutter
|
||||
- package_info_plus (0.4.5):
|
||||
- Flutter
|
||||
- path_provider_foundation (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
@@ -36,6 +38,7 @@ DEPENDENCIES:
|
||||
- Flutter (from `Flutter`)
|
||||
- flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
|
||||
- just_audio (from `.symlinks/plugins/just_audio/ios`)
|
||||
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`)
|
||||
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`)
|
||||
- sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`)
|
||||
@@ -60,6 +63,8 @@ EXTERNAL SOURCES:
|
||||
:path: ".symlinks/plugins/flutter_native_splash/ios"
|
||||
just_audio:
|
||||
:path: ".symlinks/plugins/just_audio/ios"
|
||||
package_info_plus:
|
||||
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||
path_provider_foundation:
|
||||
:path: ".symlinks/plugins/path_provider_foundation/ios"
|
||||
shared_preferences_foundation:
|
||||
@@ -81,6 +86,7 @@ SPEC CHECKSUMS:
|
||||
flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef
|
||||
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
|
||||
just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa
|
||||
package_info_plus: fd030dabf36271f146f1f3beacd48f564b0f17f7
|
||||
path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9
|
||||
shared_preferences_foundation: 986fc17f3d3251412d18b0265f9c64113a8c2472
|
||||
sign_in_with_apple: f3bf75217ea4c2c8b91823f225d70230119b8440
|
||||
|
||||
@@ -35,7 +35,7 @@ enum FDSourceType {
|
||||
rss,
|
||||
stackoverflow,
|
||||
tumblr,
|
||||
x,
|
||||
// x,
|
||||
youtube,
|
||||
none,
|
||||
}
|
||||
@@ -72,8 +72,8 @@ extension FDSourceTypeExtension on FDSourceType {
|
||||
return 'StackOverflow';
|
||||
case FDSourceType.tumblr:
|
||||
return 'Tumblr';
|
||||
case FDSourceType.x:
|
||||
return 'X';
|
||||
// case FDSourceType.x:
|
||||
// return 'X';
|
||||
case FDSourceType.youtube:
|
||||
return 'YouTube';
|
||||
default:
|
||||
@@ -105,8 +105,8 @@ extension FDSourceTypeExtension on FDSourceType {
|
||||
return const Color(0xffef8236);
|
||||
case FDSourceType.tumblr:
|
||||
return const Color(0xff34526f);
|
||||
case FDSourceType.x:
|
||||
return const Color(0xff000000);
|
||||
// case FDSourceType.x:
|
||||
// return const Color(0xff000000);
|
||||
case FDSourceType.youtube:
|
||||
return const Color(0xffff0000);
|
||||
default:
|
||||
|
||||
@@ -3,16 +3,21 @@ import 'package:supabase_flutter/supabase_flutter.dart';
|
||||
import 'package:timeago/timeago.dart' as timeago;
|
||||
|
||||
/// The [SettingsRepository] is a singleton class that is used to store the
|
||||
/// settings of the app. This includes the url and anon key of the Supabase. The
|
||||
/// [SettingsRepository] must be initialized in our main function by calling the
|
||||
/// [init] method.
|
||||
/// settings of the app and to initialize the `timeago` package and the Supabase
|
||||
/// client. The [SettingsRepository] must be initialized in our main function by
|
||||
/// calling the [init] method.
|
||||
class SettingsRepository {
|
||||
static final SettingsRepository _instance = SettingsRepository._internal();
|
||||
|
||||
String supabaseUrl = '';
|
||||
String supabaseAnonKey = '';
|
||||
String supabaseSiteUrl = '';
|
||||
String googleClientId = '';
|
||||
/// The [supabaseUrl], [supabaseAnonKey], [supabaseSiteUrl] and
|
||||
/// [googleClientId] can be adjusted during build time or by a user during
|
||||
/// runtime. By default the values of our production instance will be used.
|
||||
String supabaseUrl = 'https://ityjucpsrasavriepscr.supabase.co';
|
||||
String supabaseAnonKey =
|
||||
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Iml0eWp1Y3BzcmFzYXZyaWVwc2NyIiwicm9sZSI6ImFub24iLCJpYXQiOjE2OTQwMjY0NjIsImV4cCI6MjAwOTYwMjQ2Mn0.IDo7j9Kh8-5kHLtrZtHTvLf8lUkj7jiLynpIXSZbRFs';
|
||||
String supabaseSiteUrl = 'https://app.feeddeck.app';
|
||||
String googleClientId =
|
||||
'420185423235-9ehth1eodl4lt3cdns7kaf2e89eo6rkq.apps.googleusercontent.com';
|
||||
|
||||
factory SettingsRepository() {
|
||||
return _instance;
|
||||
@@ -21,9 +26,10 @@ class SettingsRepository {
|
||||
SettingsRepository._internal();
|
||||
|
||||
/// The [init] method initializes the [SettingsRepository] by reading the
|
||||
/// Supabase url and anon key from the shared preferences. If the Supabase url
|
||||
/// and anon key are not stored in the shared preferences, the values from the
|
||||
/// environment variables are used.
|
||||
/// the values which can be configured by the user from the shared preferences
|
||||
/// and by reading the values from the environment variables. When all values
|
||||
/// were set by a user they will be used. If not we check if all environment
|
||||
/// variables are set and use them. If not we use the default values.
|
||||
Future<void> init() async {
|
||||
try {
|
||||
timeago.setLocaleMessages('en', timeago.EnShortMessages());
|
||||
@@ -35,10 +41,17 @@ class SettingsRepository {
|
||||
final String? supabaseSiteUrlPrefs = prefs.getString('supabaseSiteUrl');
|
||||
final String? googleClientIdPrefs = prefs.getString('googleClientId');
|
||||
|
||||
const supabaseUrlEnv = String.fromEnvironment('SUPABASE_URL');
|
||||
const supabaseAnonKeyEnv = String.fromEnvironment('SUPABASE_ANON_KEY');
|
||||
const supabaseSiteUrlEnv = String.fromEnvironment('SUPABASE_SITE_URL');
|
||||
const googleClientIdEnv = String.fromEnvironment('GOOGLE_CLIENT_ID');
|
||||
|
||||
if (supabaseUrlPrefs != null &&
|
||||
supabaseAnonKeyPrefs != null &&
|
||||
supabaseSiteUrlPrefs != null &&
|
||||
googleClientIdPrefs != null) {
|
||||
/// Store the user provided values within the [SettingsRepository] and
|
||||
/// use them to initialize the Supabase client.
|
||||
supabaseUrl = supabaseUrlPrefs;
|
||||
supabaseAnonKey = supabaseAnonKeyPrefs;
|
||||
supabaseSiteUrl = supabaseSiteUrlPrefs;
|
||||
@@ -48,12 +61,12 @@ class SettingsRepository {
|
||||
url: supabaseUrlPrefs,
|
||||
anonKey: supabaseAnonKeyPrefs,
|
||||
);
|
||||
} else {
|
||||
const supabaseUrlEnv = String.fromEnvironment('SUPABASE_URL');
|
||||
const supabaseAnonKeyEnv = String.fromEnvironment('SUPABASE_ANON_KEY');
|
||||
const supabaseSiteUrlEnv = String.fromEnvironment('SUPABASE_SITE_URL');
|
||||
const googleClientIdEnv = String.fromEnvironment('GOOGLE_CLIENT_ID');
|
||||
|
||||
} else if (supabaseUrlEnv != '' &&
|
||||
supabaseAnonKeyEnv != '' &&
|
||||
supabaseSiteUrlEnv != '' &&
|
||||
googleClientIdEnv != '') {
|
||||
/// Store the values provided during the build time within the
|
||||
/// [SettingsRepository] and use them to initialize the Supabase client.
|
||||
supabaseUrl = supabaseUrlEnv;
|
||||
supabaseAnonKey = supabaseAnonKeyEnv;
|
||||
supabaseSiteUrl = supabaseSiteUrlEnv;
|
||||
@@ -63,10 +76,19 @@ class SettingsRepository {
|
||||
url: supabaseUrlEnv,
|
||||
anonKey: supabaseAnonKeyEnv,
|
||||
);
|
||||
} else {
|
||||
/// Use the default values to initialize the Supabase client.
|
||||
await Supabase.initialize(
|
||||
url: supabaseUrl,
|
||||
anonKey: supabaseAnonKey,
|
||||
);
|
||||
}
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
/// [save] can be used to store the user provided values within the shared
|
||||
/// preferences. This will not automatically use the provided values for the
|
||||
/// Supabase client and a user must restart the app first.
|
||||
Future<void> save(
|
||||
String newSupabaseUrl,
|
||||
String newSupabaseAnonKey,
|
||||
@@ -80,6 +102,9 @@ class SettingsRepository {
|
||||
await prefs.setString('googleClientId', newGoogleClientId);
|
||||
}
|
||||
|
||||
/// [delete] can be used to delete all values from the shared preferences.
|
||||
/// This will not automatically use the default values for the Supabase client
|
||||
/// and a user must restart the app first.
|
||||
Future<void> delete() async {
|
||||
final SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
await prefs.remove('supabaseUrl');
|
||||
|
||||
@@ -15,7 +15,6 @@ import 'package:feeddeck/widgets/item/details/item_details_reddit.dart';
|
||||
import 'package:feeddeck/widgets/item/details/item_details_rss.dart';
|
||||
import 'package:feeddeck/widgets/item/details/item_details_stackoverflow.dart';
|
||||
import 'package:feeddeck/widgets/item/details/item_details_tumblr.dart';
|
||||
import 'package:feeddeck/widgets/item/details/item_details_x.dart';
|
||||
import 'package:feeddeck/widgets/item/details/item_details_youtube.dart';
|
||||
|
||||
class ItemDetails extends StatelessWidget {
|
||||
@@ -111,11 +110,11 @@ class ItemDetails extends StatelessWidget {
|
||||
item: item,
|
||||
source: source,
|
||||
);
|
||||
case FDSourceType.x:
|
||||
return ItemDetailsX(
|
||||
item: item,
|
||||
source: source,
|
||||
);
|
||||
// case FDSourceType.x:
|
||||
// return ItemDetailsX(
|
||||
// item: item,
|
||||
// source: source,
|
||||
// );
|
||||
case FDSourceType.youtube:
|
||||
return ItemDetailsYoutube(
|
||||
item: item,
|
||||
|
||||
@@ -15,7 +15,6 @@ import 'package:feeddeck/widgets/item/preview/item_preview_reddit.dart';
|
||||
import 'package:feeddeck/widgets/item/preview/item_preview_rss.dart';
|
||||
import 'package:feeddeck/widgets/item/preview/item_preview_stackoverflow.dart';
|
||||
import 'package:feeddeck/widgets/item/preview/item_preview_tumblr.dart';
|
||||
import 'package:feeddeck/widgets/item/preview/item_preview_x.dart';
|
||||
import 'package:feeddeck/widgets/item/preview/item_preview_youtube.dart';
|
||||
|
||||
/// The [ItemPreview] widget displays a preview for an item in a column based on
|
||||
@@ -93,11 +92,11 @@ class ItemPreview extends StatelessWidget {
|
||||
item: item,
|
||||
source: source,
|
||||
);
|
||||
case FDSourceType.x:
|
||||
return ItemPreviewX(
|
||||
item: item,
|
||||
source: source,
|
||||
);
|
||||
// case FDSourceType.x:
|
||||
// return ItemPreviewX(
|
||||
// item: item,
|
||||
// source: source,
|
||||
// );
|
||||
case FDSourceType.youtube:
|
||||
return ItemPreviewYoutube(
|
||||
item: item,
|
||||
|
||||
@@ -13,7 +13,6 @@ import 'package:feeddeck/widgets/source/add/add_source_reddit.dart';
|
||||
import 'package:feeddeck/widgets/source/add/add_source_rss.dart';
|
||||
import 'package:feeddeck/widgets/source/add/add_source_stackoverflow.dart';
|
||||
import 'package:feeddeck/widgets/source/add/add_source_tumblr.dart';
|
||||
import 'package:feeddeck/widgets/source/add/add_source_x.dart';
|
||||
import 'package:feeddeck/widgets/source/add/add_source_youtube.dart';
|
||||
import 'package:feeddeck/widgets/source/source_icon.dart';
|
||||
|
||||
@@ -80,9 +79,9 @@ class _AddSourceState extends State<AddSource> {
|
||||
return AddSourceTumblr(column: widget.column);
|
||||
}
|
||||
|
||||
if (_sourceType == FDSourceType.x) {
|
||||
return AddSourceX(column: widget.column);
|
||||
}
|
||||
// if (_sourceType == FDSourceType.x) {
|
||||
// return AddSourceX(column: widget.column);
|
||||
// }
|
||||
|
||||
if (_sourceType == FDSourceType.stackoverflow) {
|
||||
return AddSourceStackOverflow(column: widget.column);
|
||||
|
||||
@@ -15,7 +15,7 @@ const _helpText = '''
|
||||
The Reddit source can be used to follow your favorite subreddits or users:
|
||||
|
||||
- **Subreddit**: Provide the name of the subreddit (e.g. `/r/kubernetes`)
|
||||
- **User**: Provide the name of the user (e.g. `/u/feeddeck`)
|
||||
- **User**: Provide the name of the user (e.g. `/u/reddit`)
|
||||
- **Url**: Provide the url for a user or subbreddit (e.g.
|
||||
`https://www.reddit.com/r/kubernetes/` or `https://www.reddit.com/r/kubernetes.rss`)
|
||||
''';
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:flutter_markdown/flutter_markdown.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import 'package:feeddeck/models/column.dart';
|
||||
import 'package:feeddeck/models/source.dart';
|
||||
import 'package:feeddeck/repositories/app_repository.dart';
|
||||
import 'package:feeddeck/utils/api_exception.dart';
|
||||
import 'package:feeddeck/utils/constants.dart';
|
||||
import 'package:feeddeck/utils/openurl.dart';
|
||||
@@ -44,14 +41,14 @@ class _AddSourceXState extends State<AddSourceX> {
|
||||
});
|
||||
|
||||
try {
|
||||
AppRepository app = Provider.of<AppRepository>(context, listen: false);
|
||||
await app.addSource(
|
||||
widget.column.id,
|
||||
FDSourceType.x,
|
||||
FDSourceOptions(
|
||||
x: _xController.text,
|
||||
),
|
||||
);
|
||||
// AppRepository app = Provider.of<AppRepository>(context, listen: false);
|
||||
// await app.addSource(
|
||||
// widget.column.id,
|
||||
// FDSourceType.x,
|
||||
// FDSourceOptions(
|
||||
// x: _xController.text,
|
||||
// ),
|
||||
// );
|
||||
setState(() {
|
||||
_isLoading = false;
|
||||
_error = '';
|
||||
|
||||
@@ -118,13 +118,13 @@ class SourceIcon extends StatelessWidget {
|
||||
type.color,
|
||||
const Color(0xffffffff),
|
||||
);
|
||||
case FDSourceType.x:
|
||||
return buildIcon(
|
||||
FDIcons.x,
|
||||
iconSize,
|
||||
type.color,
|
||||
const Color(0xffffffff),
|
||||
);
|
||||
// case FDSourceType.x:
|
||||
// return buildIcon(
|
||||
// FDIcons.x,
|
||||
// iconSize,
|
||||
// type.color,
|
||||
// const Color(0xffffffff),
|
||||
// );
|
||||
case FDSourceType.youtube:
|
||||
return buildIcon(
|
||||
FDIcons.youtube,
|
||||
|
||||
@@ -11,6 +11,8 @@ PODS:
|
||||
- FMDB/standard (2.7.5)
|
||||
- just_audio (0.0.1):
|
||||
- FlutterMacOS
|
||||
- package_info_plus (0.0.1):
|
||||
- FlutterMacOS
|
||||
- path_provider_foundation (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
@@ -35,6 +37,7 @@ DEPENDENCIES:
|
||||
- audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`)
|
||||
- FlutterMacOS (from `Flutter/ephemeral`)
|
||||
- just_audio (from `Flutter/ephemeral/.symlinks/plugins/just_audio/macos`)
|
||||
- package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`)
|
||||
- path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/macos`)
|
||||
- screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`)
|
||||
- shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/macos`)
|
||||
@@ -58,6 +61,8 @@ EXTERNAL SOURCES:
|
||||
:path: Flutter/ephemeral
|
||||
just_audio:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/just_audio/macos
|
||||
package_info_plus:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos
|
||||
path_provider_foundation:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/macos
|
||||
screen_retriever:
|
||||
@@ -80,6 +85,7 @@ SPEC CHECKSUMS:
|
||||
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
|
||||
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
|
||||
just_audio: 9b67ca7b97c61cfc9784ea23cd8cc55eb226d489
|
||||
package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce
|
||||
path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9
|
||||
screen_retriever: 59634572a57080243dd1bf715e55b6c54f241a38
|
||||
shared_preferences_foundation: 986fc17f3d3251412d18b0265f9c64113a8c2472
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
27D60858A3CD81E41E2CDBF2 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
|
||||
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
|
||||
33CC10ED2044A3C60003C045 /* feeddeck.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = feeddeck.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
33CC10ED2044A3C60003C045 /* FeedDeck.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FeedDeck.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
|
||||
33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
|
||||
@@ -94,7 +94,6 @@
|
||||
46A27EFECA16837D10C377EF /* Pods-Runner.release.xcconfig */,
|
||||
1AC2239B5C64F660215E2FFD /* Pods-Runner.profile.xcconfig */,
|
||||
);
|
||||
name = Pods;
|
||||
path = Pods;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@@ -123,7 +122,7 @@
|
||||
33CC10EE2044A3C60003C045 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
33CC10ED2044A3C60003C045 /* feeddeck.app */,
|
||||
33CC10ED2044A3C60003C045 /* FeedDeck.app */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
@@ -193,7 +192,7 @@
|
||||
);
|
||||
name = Runner;
|
||||
productName = Runner;
|
||||
productReference = 33CC10ED2044A3C60003C045 /* feeddeck.app */;
|
||||
productReference = 33CC10ED2044A3C60003C045 /* FeedDeck.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
@@ -422,8 +421,9 @@
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DEVELOPMENT_TEAM = 75AP6HWLUD;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.news";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
@@ -549,8 +549,9 @@
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DEVELOPMENT_TEAM = 75AP6HWLUD;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.news";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
@@ -570,8 +571,9 @@
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DEVELOPMENT_TEAM = 75AP6HWLUD;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.news";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||
BuildableName = "feeddeck.app"
|
||||
BuildableName = "FeedDeck.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
@@ -31,7 +31,7 @@
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||
BuildableName = "feeddeck.app"
|
||||
BuildableName = "FeedDeck.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
@@ -54,7 +54,7 @@
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||
BuildableName = "feeddeck.app"
|
||||
BuildableName = "FeedDeck.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
@@ -71,7 +71,7 @@
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||
BuildableName = "feeddeck.app"
|
||||
BuildableName = "FeedDeck.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
|
||||
@@ -2,9 +2,13 @@
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.app-sandbox</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-jit</key>
|
||||
<true/>
|
||||
<key>com.apple.security.network.client</key>
|
||||
<true/>
|
||||
<key>com.apple.security.network.server</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -33,5 +33,7 @@
|
||||
<key>NSAllowsArbitraryLoads</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
<string>public.app-category.news</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -2,7 +2,11 @@
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.app-sandbox</key>
|
||||
<true/>
|
||||
<key>com.apple.security.network.client</key>
|
||||
<true/>
|
||||
<key>com.apple.security.network.server</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||
# In Windows, build-name is used as the major, minor, and patch parts
|
||||
# of the product and file versions while build-number is used as the build suffix.
|
||||
version: 0.1.0+1
|
||||
version: 1.0.0+2
|
||||
|
||||
environment:
|
||||
sdk: '>=2.19.6 <3.0.0'
|
||||
@@ -160,7 +160,8 @@ msix_config:
|
||||
publisher_display_name: Rico Berger
|
||||
identity_name: 26077RicoBerger.FeedDeck
|
||||
publisher: CN=7740451A-C179-450A-B346-7231CA231332
|
||||
msix_version: 0.1.0.1
|
||||
msix_version: 1.0.0.0
|
||||
logo_path: templates/app-icon/windows.png
|
||||
languages: en-us
|
||||
capabilities: internetClient
|
||||
protocol_activation: http,https
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 48 KiB |
Binary file not shown.
@@ -19,7 +19,7 @@
|
||||
|
||||
<meta charset="UTF-8">
|
||||
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
|
||||
<meta name="description" content="A new Flutter project.">
|
||||
<meta name="description" content="Follow your RSS and Social Media Feeds">
|
||||
|
||||
<!-- iOS meta tags & icons -->
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
@@ -73,4 +73,4 @@
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
</html>
|
||||
|
||||
@@ -1,35 +1,35 @@
|
||||
{
|
||||
"name": "FeedDeck",
|
||||
"short_name": "FeedDeck",
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"background_color": "#49d3b4",
|
||||
"theme_color": "#49d3b4",
|
||||
"description": "A new Flutter project.",
|
||||
"orientation": "portrait-primary",
|
||||
"prefer_related_applications": false,
|
||||
"icons": [
|
||||
{
|
||||
"src": "icons/Icon-192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "icons/Icon-512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "icons/Icon-maskable-192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "icons/Icon-maskable-512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
}
|
||||
]
|
||||
"name": "FeedDeck",
|
||||
"short_name": "FeedDeck",
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"background_color": "#49d3b4",
|
||||
"theme_color": "#49d3b4",
|
||||
"description": "Follow your RSS and Social Media Feeds",
|
||||
"orientation": "portrait-primary",
|
||||
"prefer_related_applications": false,
|
||||
"icons": [
|
||||
{
|
||||
"src": "icons/Icon-192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "icons/Icon-512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "icons/Icon-maskable-192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "icons/Icon-maskable-512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
}
|
||||
]
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 13 KiB |
@@ -97,8 +97,8 @@ export const getFeed = async (
|
||||
);
|
||||
case "tumblr":
|
||||
return await getTumblrFeed(supabaseClient, redisClient, profile, source);
|
||||
case "x":
|
||||
return await getXFeed(supabaseClient, redisClient, profile, source);
|
||||
// case "x":
|
||||
// return await getXFeed(supabaseClient, redisClient, profile, source);
|
||||
case "youtube":
|
||||
return await getYoutubeFeed(supabaseClient, redisClient, profile, source);
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user