From 0aaa406b179e366e6a527f052379184787440b42 Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Tue, 4 Oct 2022 11:10:24 -0500 Subject: [PATCH] Implement profile-update api --- src/state/lib/api.ts | 28 +++++++++++++++++++++++----- src/state/models/profile-view.ts | 4 ++-- src/view/com/modals/EditProfile.tsx | 18 ++++++++++++++---- todos.txt | 4 ---- 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/state/lib/api.ts b/src/state/lib/api.ts index ad81301f..f2418ef3 100644 --- a/src/state/lib/api.ts +++ b/src/state/lib/api.ts @@ -5,7 +5,7 @@ // import {ReactNativeStore} from './auth' import AdxApi from '../../third-party/api' -import {ServiceClient} from '../../third-party/api/src/index' +import * as Profile from '../../third-party/api/src/types/todo/social/profile' import {AdxUri} from '../../third-party/uri' import {RootStoreModel} from '../models/root-store' import {extractEntities} from '../../view/lib/strings' @@ -100,11 +100,29 @@ export async function unfollow(store: RootStoreModel, followUri: string) { } export async function updateProfile( - adx: ServiceClient, - user: string, - profile: bsky.Profile.Record, + store: RootStoreModel, + modifyFn: (existing?: Profile.Record) => Profile.Record, ) { - throw new Error('TODO') + const res = await store.api.todo.social.profile.list({ + nameOrDid: store.me.did || '', + }) + const existing = res.records[0] + if (existing) { + await store.api.todo.social.profile.put( + { + did: store.me.did || '', + tid: new AdxUri(existing.uri).recordKey, + }, + modifyFn(existing.value), + ) + } else { + await store.api.todo.social.profile.create( + { + did: store.me.did || '', + }, + modifyFn(), + ) + } } interface FetchHandlerResponse { diff --git a/src/state/models/profile-view.ts b/src/state/models/profile-view.ts index a7b8a7c7..aa0040d6 100644 --- a/src/state/models/profile-view.ts +++ b/src/state/models/profile-view.ts @@ -88,11 +88,11 @@ export class ProfileViewModel { } } - async updateProfile(profile: Profile.Record) { + async updateProfile(fn: (existing?: Profile.Record) => Profile.Record) { if (this.did !== this.rootStore.me.did) { throw new Error('Not your profile!') } - await apilib.updateProfile(this.rootStore.api, this.did, profile) + await apilib.updateProfile(this.rootStore, fn) await this.refresh() } diff --git a/src/view/com/modals/EditProfile.tsx b/src/view/com/modals/EditProfile.tsx index 72cbd411..740d8189 100644 --- a/src/view/com/modals/EditProfile.tsx +++ b/src/view/com/modals/EditProfile.tsx @@ -6,6 +6,7 @@ import {ErrorMessage} from '../util/ErrorMessage' import {useStores} from '../../../state' import {ProfileViewModel} from '../../../state/models/profile-view' import {s, colors, gradients} from '../../lib/styles' +import * as Profile from '../../../third-party/api/src/types/todo/social/profile' export const snapPoints = ['80%'] @@ -23,10 +24,19 @@ export function Component({profileView}: {profileView: ProfileViewModel}) { setError('') } try { - await profileView.updateProfile({ - displayName, - description, - }) + await profileView.updateProfile( + (existing?: Profile.Record): Profile.Record => { + if (existing) { + existing.displayName = displayName + existing.description = description + return existing + } + return { + displayName, + description, + } + }, + ) Toast.show('Profile updated', { position: Toast.positions.TOP, }) diff --git a/todos.txt b/todos.txt index 171be4d5..28ebfe1c 100644 --- a/todos.txt +++ b/todos.txt @@ -11,10 +11,6 @@ Paul's todo list - Firehose - Composer - Update the view after creating a post -- Profile - - Implement update/edit - - Disable editing avi or banner - - More button - Linking - Web linking - App linking