From 3be14ec94b190a9d399379a4157784c6a79e0b96 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Wed, 1 Feb 2023 21:50:32 -0600 Subject: [PATCH] Start of an actor search screen, finally --- .../activitypub_actor_search_main.ans | Bin 0 -> 2823 bytes .../activitypub_actor_view.ans | Bin 0 -> 2840 bytes art/themes/luciano_blocktronics/theme.hjson | 29 ++++ core/activitypub/actor_search.js | 161 ++++++++++++++++++ 4 files changed, 190 insertions(+) create mode 100644 art/themes/luciano_blocktronics/activitypub_actor_search_main.ans create mode 100644 art/themes/luciano_blocktronics/activitypub_actor_view.ans create mode 100644 core/activitypub/actor_search.js diff --git a/art/themes/luciano_blocktronics/activitypub_actor_search_main.ans b/art/themes/luciano_blocktronics/activitypub_actor_search_main.ans new file mode 100644 index 0000000000000000000000000000000000000000..802ea16dc27e91e9d7e2d9a68db3bf556777dc45 GIT binary patch literal 2823 zcmcgs!EVz)5KTGe3lO>Z()-3isnncI6af+yC`o(Csfvm?u!&UQz{l_pRe#5p_D>M+ z&CG7rX&@0Y_+Wc?X5P$uGrNP8^Zlaz3|6DDZ<+?XgVk^{DzPYJiS^6U*EK%yz}tEH zxCsN)cS1`;N5?HO1whqi_X?{aH4`_<0(aoy0h9#C(gfNeaUPuIL$(W8@n~MA=Z35T z@whY_sT`=;LNanOBt&;0P>zX$DK*&Ao)sWk7?UI+HGr_dlrMaQ=Ljk>W$J=a4Na&I zr4^DAK+UZnX+^A7V9|t-NQ)m^1)-A;0EZJbL103qmu=xg4&nwZVOvv*9bI+#la|&3 zr3%jI1rR{G2EiR`BaQY#rj#ql!+`yik>lfIEJ0YLlC?E4E@@%am@?#^=;B}9l(Y4A zKevhyadY9sg7Pim!b|(4yG4`tSJ^;-LIyz-p)r^Yuo7bJ!$irY6NE;Q4-ZkGSV!U) z4Ir4osd(a~*#yQ^MN8NQ%S_ia6B$|tq2m(eQb5Dv(I=WrrZ7PqMAFF@%FNZ5x{?r*D#RSM{-KbR7I_F(qN=FC)hKcC)_woCE!?CJJ#Z z&FS_eb4y>n2xUkXcenTJPsPXWeNnBy;(a}TXYdw#DH@G=DPfY%XUicB_C2Z8!!=O- zt{zVOZl*)i=N+cfkNx@bs$>Z`8Ty;Mc2xm!bcVY`1O*&l=R^B==%MQ-kwN$OQni=e zq#{b2P+b1M^WGJcCs)ZoIktOQ-MMU><7Vo_aBXU?5~S#7qP n?|%F3%Mstwl_OWW;g5c=cXsxn_q-?1v$wCViksJ!uG0G#vi#)8 literal 0 HcmV?d00001 diff --git a/art/themes/luciano_blocktronics/activitypub_actor_view.ans b/art/themes/luciano_blocktronics/activitypub_actor_view.ans new file mode 100644 index 0000000000000000000000000000000000000000..45e18bfc7487dabd0c40fa4064b995373667d9e2 GIT binary patch literal 2840 zcmcguO=}x55OsR=FDUh8FS*O>vWEDycHLq~+fdtq;8R*c4~=YS$f19#g#4Wq=%19n z`H-x2I`H*dhT|APP(vyK# zp73a?dqgEuvxX$(LWmFUKp;6r0w&b37j0SqYoSb{grot41t!1Y!#oF2iBiTcC{^!# zlS|7aIe;|Rg18l-T82dvd?d|&)G7!abpSY=ND~A`RPs_2Uc`ajfW>SZl446&T>hk` zwm_(YGkO68kZwS5%UVgJy^ty9^88T1Zpy&%{yvnzEMm#hnh+PY&}vi};vVVZTik@R z_I5Y7h!Aj7;dlq-YsAoU`?$M>OZzKqAV9%`Ac@czOa@pnvG!pi$+;5*jUw;vfQpd}D8E7RHgkT@>RB;EN17k#l_ijT;TiTr{c|YQO{22R3DLm@0LWSI2i~#olnTy z*prar>!$d8`Q=*@yss)wm4QCY6oqanELS0q$@1pv`})#eW#BdTgjK4T|Ii*UPWu_( zoGG6>>R#Emx7XLjhivkFxl7&1<;&RUFl@)&yDqLb{AD~3Hp%QB9G(lz3nzyy=l^`0 zm#Vum_{QqGy?j3GzKAxVkmWz0^U5BN7XvB=6dg2;#F)x2I#rp7!$gL=JL|FE0en@4<0Qw~gN`aip!&e73X=VgbV P7qjvE;{07LtN8mHY4_}2 literal 0 HcmV?d00001 diff --git a/art/themes/luciano_blocktronics/theme.hjson b/art/themes/luciano_blocktronics/theme.hjson index 4fc408c6..b83ce01d 100644 --- a/art/themes/luciano_blocktronics/theme.hjson +++ b/art/themes/luciano_blocktronics/theme.hjson @@ -460,6 +460,35 @@ } } + // :TODO: move this to the right area, rename, etc. + mainMenuActivityPubActorSearch: { + 0: { + mci: { + TL1: { + width: 70 + } + BT2: { + width: 20 + focusTextStyle: upper + } + } + } + 1: { + mci: { + TL1: { + width: 70 + } + TL2: { + width: 70 + } + BT3: { + width: 20 + focusTextStyle: upper + } + } + } + } + mainMenuRumorz: { 0: { mci: { diff --git a/core/activitypub/actor_search.js b/core/activitypub/actor_search.js new file mode 100644 index 00000000..41fe76e7 --- /dev/null +++ b/core/activitypub/actor_search.js @@ -0,0 +1,161 @@ +const { MenuModule } = require('../menu_module'); +const { Errors } = require('../enig_error'); +const Actor = require('../activitypub/actor'); + +// deps +const async = require('async'); +const { get, truncate } = require('lodash'); + +exports.moduleInfo = { + name: 'ActivityPub Actor Search', + desc: 'Menu item to search for an ActivityPub actor', + author: 'CognitiveGears', +}; + +const FormIds = { + main: 0, + view: 1, +}; + +const MciViewIds = { + main: { + searchUrl: 1, + searchOrCancel: 2, + }, + view: { + userName: 1, + fullName: 2, + }, +}; + +exports.getModule = class ActivityPubActorSearch extends MenuModule { + constructor(options) { + super(options); + + this.config = Object.assign({}, get(options, 'menuConfig.config'), { + extraArgs: options.extraArgs, + }); + + this.menuMethods = { + submit: (formData, extraArgs, cb) => { + switch (formData.submitId) { + case MciViewIds.main.searchUrl: { + return this._search(formData.value, cb); + } + case MciViewIds.main.searchOrCancel: { + const search = get(formData, 'value.searchOrCancel') === 0; + return search + ? this._search(formData.value, cb) + : this.prevMenu(cb); + } + + default: + cb( + Errors.UnexpectedState( + `Unexpected submitId: ${formData.submitId}` + ) + ); + } + }, + }; + } + + initSequence() { + async.series( + [ + callback => { + return this.beforeArt(callback); + }, + callback => { + return this._displayMainPage(false, callback); + }, + ], + () => { + this.finishedLoading(); + } + ); + } + + _search(values, cb) { + const searchString = values['searchUrl'].trim(); + //TODO: Handle empty searchString + Actor.fromId(searchString, (err, remoteActor) => { + if (err) { + this.client.log.warn( + { remoteActor: remoteActor, err: err }, + 'Failure to search for actor' + ); + // TODO: Add error to page for failure to find actor + return this._displayMainPage(true, cb); + } + return this._displayListScreen(remoteActor, cb); + }); + } + + _displayListScreen(remoteActor, cb) { + async.series( + [ + callback => { + return this.displayArtAndPrepViewController( + 'view', + FormIds.view, + { clearScreen: true }, + callback + ); + }, + callback => { + return this.validateMCIByViewIds( + 'view', + Object.values(MciViewIds.view), + callback + ); + }, + callback => { + const v = id => this.getView('view', id); + + const nameView = v(MciViewIds.view.userName); + nameView.setText( + truncate(remoteActor.preferredUsername, { + length: nameView.getWidth(), + }) + ); + + // TODO: FIXME: fullNameView.getWidth() is 0 - I'm thinking it's getting form 0 for some reason + const fullNameView = v(MciViewIds.view.fullName); + fullNameView.setText( + truncate(remoteActor.name, { length: fullNameView.getWidth() }) + ); + return callback(null); + }, + ], + err => { + return cb(err); + } + ); + } + + _displayMainPage(clearScreen, cb) { + async.series( + [ + callback => { + return this.displayArtAndPrepViewController( + 'main', + FormIds.main, + { clearScreen }, + callback + ); + }, + callback => { + return this.validateMCIByViewIds( + 'main', + Object.values(MciViewIds.main), + callback + ); + }, + ], + err => { + return cb(err); + } + ); + } +};