Skip to content

Commit

Permalink
Merge pull request #23 from dasmikko/development
Browse files Browse the repository at this point in the history
1.2.6
  • Loading branch information
dasmikko authored Aug 1, 2019
2 parents 9070fe5 + 18d17ab commit 834a22f
Show file tree
Hide file tree
Showing 35 changed files with 1,712 additions and 550 deletions.
44 changes: 28 additions & 16 deletions lib/helpers/api.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:knocky/helpers/hiveHelper.dart';
import 'package:knocky/models/events.dart';
import 'package:knocky/models/subforum.dart';
import 'package:knocky/models/subforumDetails.dart';
import 'package:knocky/models/thread.dart';
import 'package:knocky/models/threadAlert.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:knocky/models/readThreads.dart';
import 'package:dio/dio.dart';
import 'package:hive/hive.dart';

class KnockoutAPI {
static const KNOCKOUT_URL = "https://api.knockout.chat/";
Expand All @@ -34,16 +35,18 @@ class KnockoutAPI {
throw ('URL not set!');
}

SharedPreferences prefs = await SharedPreferences.getInstance();
Box box = await AppHiveBox.getBox();

Map<String, dynamic> mHeaders = {
'Cookie': prefs.getString('cookieString'),
'Cookie': await box.get('cookieString'),
'Access-Control-Request-Headers': 'content-format-version,content-type',
'content-format-version': '1'
};
if (headers != null) mHeaders.addAll(headers);

String mBaseurl =
prefs.getString('env') == 'knockout' ? KNOCKOUT_URL : QA_URL;
await box.get('env') == 'knockout' ? KNOCKOUT_URL : QA_URL;


Dio dio = new Dio();
dio.options.baseUrl = mBaseurl;
Expand Down Expand Up @@ -86,6 +89,7 @@ class KnockoutAPI {
url: 'subforum/' + id.toString() + '/' + page.toString());
return SubforumDetails.fromJson(response.data);
} on DioError catch (e) {
print(e);
return null;
}
}
Expand All @@ -112,32 +116,30 @@ class KnockoutAPI {
.map<ThreadAlert>((json) => ThreadAlert.fromJson(json))
.toList();
} on DioError catch (e) {
print(e);
throw e;
}
}

Future<void> readThreads(DateTime lastseen, int threadId) async {
ReadThreads jsonToPost =
new ReadThreads(lastSeen: lastseen, threadId: threadId);
final response = await _request(
await _request(
type: 'post', url: 'readThreads', data: jsonToPost.toJson());
}

Future<void> readThreadSubsciption(DateTime lastseen, int threadId) async {
ReadThreads jsonToPost =
new ReadThreads(lastSeen: lastseen, threadId: threadId);
final response =
await _request(type: 'post', url: 'alert', data: jsonToPost.toJson());
await _request(type: 'post', url: 'alert', data: jsonToPost.toJson());
}

Future<List<ThreadAlert>> getEvents() async {
final response = await http.get(baseurl + 'events', headers: {});
Future<List<KnockoutEvent>> getEvents() async {
final response = await _request(type: 'get', url: 'events');

final parsedJson = json.decode(response.body).cast<Map<String, dynamic>>();

return parsedJson
.map<ThreadAlert>((json) => ThreadAlert.fromJson(json))
.toList();
return response.data
.map<KnockoutEvent>((json) => KnockoutEvent.fromJson(json))
.toList();
}

Future<void> deleteThreadAlert(int threadid) async {
Expand Down Expand Up @@ -177,11 +179,12 @@ class KnockoutAPI {
'content-format-version': '1'
});
} on DioError catch (e) {
print(e);
}
}

Future<void> updatePost(String content, int postId, int threadId) async {
final response = await _request(
await _request(
type: 'post',
url: 'post',
data: {'content': content, 'id': postId, 'thread_id': threadId});
Expand All @@ -206,4 +209,13 @@ class KnockoutAPI {
.map<SubforumThreadLatestPopular>((json) => SubforumThreadLatestPopular.fromJson(json))
.toList();
}

Future<bool> renameThread(int threadId, String newTitle) async {
final response = await _request(
url: 'thread', type: 'put', data: {'id': threadId, 'title': newTitle});

bool wasRejected = response.data['isRejected'];

return wasRejected;
}
}
238 changes: 238 additions & 0 deletions lib/helpers/bbcode.dart
Original file line number Diff line number Diff line change
Expand Up @@ -231,12 +231,56 @@ class BBCodeHandler implements bbob.NodeVisitor {
return false;
}

if (element.tag == 'ul') {
_lastElement = SlateNode(
object: 'block',
type: 'bulleted-list',
data: SlateNodeData(),
nodes: []);
}

if (element.tag == 'ol') {
_lastElement = SlateNode(
object: 'block',
type: 'numbered-list',
data: SlateNodeData(),
nodes: []);
}

if (element.tag == 'li') {
_lastElement.nodes.add(
SlateNode(
object: 'block',
type: 'list-item',
data: SlateNodeData(),
nodes: []),
);
}

// Handle children
return true;
}

void visitElementAfter(bbob.Element element) {
switch (element.tag) {
case 'li':
SlateNode textNode = SlateNode(object: 'text', leaves: [
SlateLeaf(
text: _leafContentBuffer.toString(),
marks: _leafMarks,
object: 'leaf')
]);

// Reset leaf marks
_leafMarks = List();

_lastElement.nodes.last.nodes.add(textNode);
_leafContentBuffer = StringBuffer();
break;
case 'ul':
document.nodes.add(_lastElement);
_lastElement = null;
break;
default:
// Tag is done, add leaf
SlateNode textNode = SlateNode(object: 'text', leaves: [
Expand All @@ -253,4 +297,198 @@ class BBCodeHandler implements bbob.NodeVisitor {
_leafContentBuffer = StringBuffer();
}
}

Map<String, dynamic> slateDocumentToBBCode(SlateDocument document) {
String bbcode = _handleNodes(document.nodes).trim();
return {'bbcode': bbcode, 'userquotes': {}};
}

String _inlineHandler(SlateNode object, SlateNode node) {
StringBuffer content = new StringBuffer();

if (node.type == 'link') {
content.write('[url]');
node.nodes.forEach((inlineNode) {
inlineNode.leaves.forEach((leaf) {
content.write(leaf.text);
});
});
content.write('[/url]');
} else {
node.nodes.forEach((inlineNode) {
inlineNode.leaves.forEach((leaf) {
content.write(leaf.text);
});
});
}
return content.toString();
}

dynamic _handleNodes(List<SlateNode> nodes,
{bool isChild = false, bool asList = false}) {
StringBuffer content = new StringBuffer();
List<String> contentItems = List();

nodes.forEach((node) {
if (asList) {
print(node.type);
}

// Handle blocks
switch (node.type) {
case 'paragraph':
node.nodes.asMap().forEach((i, line) {
if (line.leaves != null) {
content.write(_leafHandler(line.leaves));
}

// Handle inline element
if (line.object == 'inline') {
// Handle links
if (line.type == 'link') {
line.nodes.forEach((inlineNode) {
inlineNode.leaves.forEach((leaf) {
content.write('[url]' + leaf.text + '[/url]');
});
});
} else {
line.nodes.forEach((inlineNode) {
inlineNode.leaves.forEach((leaf) {
content.write(leaf.text);
});
});
}
}
});
content.write('\n');
break;
case 'heading-one':
node.nodes.forEach((line) {
content.write('[h1]');
if (line.leaves != null) {
// Handle node leaves
content.write(_leafHandler(line.leaves));
}

// Handle inline element
if (line.object == 'inline') {
// Handle links
content.write(_inlineHandler(node, line));
}
});
content.write('[/h1]\n');
//widgets.add(headingToWidget(node));
break;
case 'heading-two':
node.nodes.forEach((line) {
content.write('[h2]');
if (line.leaves != null) {
// Handle node leaves
content.write(_leafHandler(line.leaves));
}

// Handle inline element
if (line.object == 'inline') {
// Handle links
content.write(_inlineHandler(node, line));
}
});
content.write('[/h2]\n');
break;
case 'userquote':
//widgets.add(userquoteToWidget(node, isChild: isChild));
break;
case 'bulleted-list':
content.write('[ul]');
List<String> listItemsContent = List();
listItemsContent.addAll(_handleNodes(node.nodes, asList: true));
listItemsContent.forEach((item) {
content.write('[li]' + item + '[/li]');
});
content.write('[/ul]\n');
break;
case 'numbered-list':
//widgets.add(numberedListToWidget(node));
break;
case 'list-item':
node.nodes.asMap().forEach((i, line) {
if (line.leaves != null) {
content.write(_leafHandler(line.leaves));
}

// Handle inline element
if (line.object == 'inline') {
// Handle links
if (line.type == 'link') {
line.nodes.forEach((inlineNode) {
inlineNode.leaves.forEach((leaf) {
content.write('[url]' + leaf.text + '[/url]');
});
});
} else {
line.nodes.forEach((inlineNode) {
inlineNode.leaves.forEach((leaf) {
content.write(leaf.text);
});
});
}
}
});
break;
case 'image':
content.write('[img]' + node.data.src + '[/img]\n');
break;
case 'youtube':
//(widgets.add(youTubeToWidget(node));
break;
case 'block-quote':
//widgets.add(handleQuotes(node));
break;
case 'twitter':
//widgets.add(EmbedWidget(url: node.data.src));
break;
case 'video':
//widgets.add(handleVideo(node));
break;
}

if (asList) {
contentItems.add(content.toString());
content.clear();
}
});

if (asList) {
return contentItems;
}
print(content.toString());
return content.toString();
}

String _leafHandler(List<SlateLeaf> leaves) {
StringBuffer content = new StringBuffer();
leaves.forEach((leaf) {
bool isBold = leaf.marks.where((mark) => mark.type == 'bold').length > 0;

bool isItalic =
leaf.marks.where((mark) => mark.type == 'italic').length > 0;

bool isUnderlined =
leaf.marks.where((mark) => mark.type == 'underlined').length > 0;

bool isCode = leaf.marks.where((mark) => mark.type == 'code').length > 0;

bool isSpoiler =
leaf.marks.where((mark) => mark.type == 'spoiler').length > 0;

if (isBold) content.write('[b]' + leaf.text + '[/b]');
if (isItalic) content.write('[i]' + leaf.text + '[/i]');
if (isUnderlined) content.write('[u]' + leaf.text + '[/u]');
if (isCode) content.write('[code]' + leaf.text + '[/code]');
if (isSpoiler) content.write('[spoiler]' + leaf.text + '[/spoiler]');
if (!isBold && !isItalic && !isUnderlined && !isCode && !isCode)
content.write(leaf.text);
});
return content.toString();
}
}
17 changes: 17 additions & 0 deletions lib/helpers/hiveHelper.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:hive/hive.dart';

class AppHiveBox {
static Future<void> initHive() async {
// Init hive
Directory appDoc = await getApplicationDocumentsDirectory();
Hive.init(appDoc.path);
}

static Future<Box> getBox() async {
return Hive.box('knockyBox', compactionStrategy: (entries, deletedEntries) {
return deletedEntries > 50;
});
}
}
Loading

0 comments on commit 834a22f

Please sign in to comment.