123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- import { Component } from "@angular/core";
- import {
- IonicPage,
- NavController,
- NavParams,
- LoadingController,
- AlertController
- } from "ionic-angular";
- import { FormBuilder, Validators, FormGroup } from "@angular/forms";
- import { TwitterApiProvider } from "../../providers/twitter-api/twitter-api";
- import { Storage } from "@ionic/storage";
- import { P2pStorageIpfsProvider } from "../../providers/p2p-storage-ipfs/p2p-storage-ipfs";
- import { P2pDatabaseGunProvider } from "../../providers/p2p-database-gun/p2p-database-gun";
- import twittertext from "twitter-text";
- import { CryptoProvider } from "../../providers/crypto/crypto";
- @IonicPage()
- @Component({
- selector: "page-write-tweet",
- templateUrl: "write-tweet.html"
- })
- export class WriteTweetPage {
- tweet: FormGroup;
- retweetId: string;
- replyToStatusId: string;
- retweet;
- replyTweet;
- constructor(
- public navCtrl: NavController,
- public navParams: NavParams,
- private formBuilder: FormBuilder,
- private twitter: TwitterApiProvider,
- private loadingCtrl: LoadingController,
- private storage: Storage,
- private ipfs: P2pStorageIpfsProvider,
- private gun: P2pDatabaseGunProvider,
- private cryptoUtils: CryptoProvider,
- private alertCtrl: AlertController
- ) {
- this.retweetId = this.navParams.get("tweetId");
- this.replyToStatusId = this.navParams.get("replyToStatus");
- this.tweet = this.formBuilder.group({
- text: ["", Validators.maxLength(140)],
- p2p: [false]
- });
- }
- async ionViewDidLoad() {
- if (this.retweetId) {
- this.retweet = await this.twitter.fetchTweet(this.retweetId);
- }
- if (this.replyToStatusId) {
- this.replyTweet = await this.twitter.fetchTweet(this.replyToStatusId);
- }
- }
- get tweetCharProgress() {
- let progress = 1 - this.tweet.value["text"].length / 140;
- let radius = 8;
- let circumference = Math.PI * radius * 2;
- return progress * circumference;
- }
- async submitTweet() {
- const loading = this.loadingCtrl.create();
- loading.present();
- if (this.tweet.value.p2p) {
- loading.setContent("Validate keys...");
- if (
- (await this.cryptoUtils.isPrivateKeySet()) &&
- (await this.cryptoUtils.isPublicKeyPublished())
- ) {
- loading.setContent("Publish private tweet...");
- await this.tweetPrivate();
- } else {
- loading.dismiss();
- const alert = this.alertCtrl.create({
- title: "Oooops...",
- message:
- "Please verify that you have set a private and public key in the settings and that your latest public key was published."
- });
- alert.present();
- return;
- }
- } else {
- loading.setContent("Publish on Twitter...");
- await this.twitter.tweet(
- this.tweet.value["text"],
- this.retweet,
- this.replyToStatusId
- );
- }
- loading.dismiss();
- this.navCtrl.pop();
- }
- private async tweetPrivate() {
- const tweet = await this.buildPrivateTweet();
- const privateKey = await this.storage.get("privateKey");
- const encryptedTweet = this.cryptoUtils.encrypt(
- JSON.stringify(tweet),
- privateKey
- );
- const res = await this.ipfs.storeTweet(encryptedTweet);
- this.gun.storeLastTweetHashForUser(
- tweet.user_id,
- res["Hash"],
- tweet.created_at
- );
- this.gun.publishHashtags(tweet.entities.hashtags);
- }
- private async buildPrivateTweet() {
- const status = this.tweet.value["text"].trim();
- const entities = await this.getEntities(status);
- return {
- full_text: status,
- user_id: await this.storage.get("userId"),
- created_at: Date.now(),
- private_tweet: true,
- in_reply_to_status_id: this.replyToStatusId,
- quoted_status_id: this.retweetId,
- display_text_range: [0, status.length],
- entities: entities
- };
- }
- private async getEntities(status: string) {
- return {
- hashtags: twittertext.extractHashtagsWithIndices(status),
- urls: twittertext.extractUrlsWithIndices(status),
- user_mentions: await this.getMentions(status)
- };
- }
- private async getMentions(status: string) {
- // extract mentions
- const entities = twittertext.extractMentionsWithIndices(status);
- // add user_id
- const entitiesWithPromises = entities.map(async mention => {
- try {
- const user = await this.twitter.fetchUserFromScreenName(
- mention.screenName
- );
- mention["id_str"] = user[0]["id_str"];
- mention["screen_name"] = mention.screenName;
- delete mention.screenName;
- } catch (err) {
- console.error(
- "There is no user signed up to twitter with username: " +
- mention.screenName
- );
- }
- return mention;
- });
- // filter for valid users and return
- return (await Promise.all(entitiesWithPromises)).filter(el =>
- el.hasOwnProperty("id_str")
- );
- }
- }
|