Replace mobx-state-tree with mobx and get a basic home feed rendering
This commit is contained in:
parent
6b32698b3e
commit
dc55f58004
20 changed files with 534 additions and 273 deletions
210
src/state/lib/api.ts
Normal file
210
src/state/lib/api.ts
Normal file
|
@ -0,0 +1,210 @@
|
|||
/**
|
||||
* The environment is a place where services and shared dependencies between
|
||||
* models live. They are made available to every model via dependency injection.
|
||||
*/
|
||||
|
||||
// import {ReactNativeStore} from './auth'
|
||||
import {AdxClient, AdxRepoClient} from '@adxp/mock-api'
|
||||
import * as storage from './storage'
|
||||
|
||||
export async function setup(adx: AdxClient) {
|
||||
await adx.setupMock(
|
||||
() => storage.load('mock-root'),
|
||||
async root => {
|
||||
await storage.save('mock-root', root)
|
||||
},
|
||||
() => generateMockData(adx),
|
||||
)
|
||||
}
|
||||
|
||||
// TEMPORARY
|
||||
// mock api config
|
||||
// =======
|
||||
|
||||
function* dateGen() {
|
||||
let start = 1657846031914
|
||||
while (true) {
|
||||
yield new Date(start).toISOString()
|
||||
start += 1e3
|
||||
}
|
||||
}
|
||||
const date = dateGen()
|
||||
|
||||
function repo(adx: AdxClient, didOrName: string) {
|
||||
const userDb = adx.mockDb.getUser(didOrName)
|
||||
if (!userDb) throw new Error(`User not found: ${didOrName}`)
|
||||
return adx.mainPds.repo(userDb.did, userDb.writable)
|
||||
}
|
||||
|
||||
export async function generateMockData(adx: AdxClient) {
|
||||
await adx.mockDb.addUser({name: 'alice.com', writable: true})
|
||||
await adx.mockDb.addUser({name: 'bob.com', writable: true})
|
||||
await adx.mockDb.addUser({name: 'carla.com', writable: true})
|
||||
|
||||
const alice = repo(adx, 'alice.com')
|
||||
const bob = repo(adx, 'bob.com')
|
||||
const carla = repo(adx, 'carla.com')
|
||||
|
||||
await alice.collection('blueskyweb.xyz:Profiles').put('Profile', 'profile', {
|
||||
$type: 'blueskyweb.xyz:Profile',
|
||||
displayName: 'Alice',
|
||||
description: 'Test user 1',
|
||||
})
|
||||
await bob.collection('blueskyweb.xyz:Profiles').put('Profile', 'profile', {
|
||||
$type: 'blueskyweb.xyz:Profile',
|
||||
displayName: 'Bob',
|
||||
description: 'Test user 2',
|
||||
})
|
||||
await carla.collection('blueskyweb.xyz:Profiles').put('Profile', 'profile', {
|
||||
$type: 'blueskyweb.xyz:Profile',
|
||||
displayName: 'Carla',
|
||||
description: 'Test user 3',
|
||||
})
|
||||
|
||||
// everybody follows everybody
|
||||
const follow = async (who: AdxRepoClient, subjectName: string) => {
|
||||
const subjectDb = adx.mockDb.getUser(subjectName)
|
||||
return who.collection('blueskyweb.xyz:Follows').create('Follow', {
|
||||
$type: 'blueskyweb.xyz:Follow',
|
||||
subject: {
|
||||
did: subjectDb?.did,
|
||||
name: subjectDb?.name,
|
||||
},
|
||||
createdAt: date.next().value,
|
||||
})
|
||||
}
|
||||
await follow(alice, 'bob.com')
|
||||
await follow(alice, 'carla.com')
|
||||
await follow(bob, 'alice.com')
|
||||
await follow(bob, 'carla.com')
|
||||
await follow(carla, 'alice.com')
|
||||
await follow(carla, 'bob.com')
|
||||
|
||||
// 2 posts on each user
|
||||
const alicePosts: {uri: string}[] = []
|
||||
for (let i = 0; i < 2; i++) {
|
||||
alicePosts.push(
|
||||
await alice.collection('blueskyweb.xyz:Posts').create('Post', {
|
||||
$type: 'blueskyweb.xyz:Post',
|
||||
text: `Alice post ${i + 1}`,
|
||||
createdAt: date.next().value,
|
||||
}),
|
||||
)
|
||||
await bob.collection('blueskyweb.xyz:Posts').create('Post', {
|
||||
$type: 'blueskyweb.xyz:Post',
|
||||
text: `Bob post ${i + 1}`,
|
||||
createdAt: date.next().value,
|
||||
})
|
||||
await carla.collection('blueskyweb.xyz:Posts').create('Post', {
|
||||
$type: 'blueskyweb.xyz:Post',
|
||||
text: `Carla post ${i + 1}`,
|
||||
createdAt: date.next().value,
|
||||
})
|
||||
}
|
||||
|
||||
// small thread of replies on alice's first post
|
||||
const bobReply1 = await bob
|
||||
.collection('blueskyweb.xyz:Posts')
|
||||
.create('Post', {
|
||||
$type: 'blueskyweb.xyz:Post',
|
||||
text: 'Bob reply',
|
||||
reply: {root: alicePosts[0].uri, parent: alicePosts[0].uri},
|
||||
createdAt: date.next().value,
|
||||
})
|
||||
await carla.collection('blueskyweb.xyz:Posts').create('Post', {
|
||||
$type: 'blueskyweb.xyz:Post',
|
||||
text: 'Carla reply',
|
||||
reply: {root: alicePosts[0].uri, parent: alicePosts[0].uri},
|
||||
createdAt: date.next().value,
|
||||
})
|
||||
const aliceReply1 = await alice
|
||||
.collection('blueskyweb.xyz:Posts')
|
||||
.create('Post', {
|
||||
$type: 'blueskyweb.xyz:Post',
|
||||
text: 'Alice reply',
|
||||
reply: {root: alicePosts[0].uri, parent: bobReply1.uri},
|
||||
createdAt: date.next().value,
|
||||
})
|
||||
|
||||
// bob and carla repost alice's first post
|
||||
await bob.collection('blueskyweb.xyz:Posts').create('Repost', {
|
||||
$type: 'blueskyweb.xyz:Repost',
|
||||
subject: alicePosts[0].uri,
|
||||
createdAt: date.next().value,
|
||||
})
|
||||
await carla.collection('blueskyweb.xyz:Posts').create('Repost', {
|
||||
$type: 'blueskyweb.xyz:Repost',
|
||||
subject: alicePosts[0].uri,
|
||||
createdAt: date.next().value,
|
||||
})
|
||||
|
||||
// bob likes all of alice's posts
|
||||
for (let i = 0; i < 2; i++) {
|
||||
await bob.collection('blueskyweb.xyz:Likes').create('Like', {
|
||||
$type: 'blueskyweb.xyz:Like',
|
||||
subject: alicePosts[i].uri,
|
||||
createdAt: date.next().value,
|
||||
})
|
||||
}
|
||||
|
||||
// carla likes all of alice's posts and everybody's replies
|
||||
for (let i = 0; i < 2; i++) {
|
||||
await carla.collection('blueskyweb.xyz:Likes').create('Like', {
|
||||
$type: 'blueskyweb.xyz:Like',
|
||||
subject: alicePosts[i].uri,
|
||||
createdAt: date.next().value,
|
||||
})
|
||||
}
|
||||
await carla.collection('blueskyweb.xyz:Likes').create('Like', {
|
||||
$type: 'blueskyweb.xyz:Like',
|
||||
subject: aliceReply1.uri,
|
||||
createdAt: date.next().value,
|
||||
})
|
||||
await carla.collection('blueskyweb.xyz:Likes').create('Like', {
|
||||
$type: 'blueskyweb.xyz:Like',
|
||||
subject: bobReply1.uri,
|
||||
createdAt: date.next().value,
|
||||
})
|
||||
|
||||
// give alice 3 badges, 2 from bob and 2 from carla, with one ignored
|
||||
const inviteBadge = await bob
|
||||
.collection('blueskyweb.xyz:Badges')
|
||||
.create('Badge', {
|
||||
$type: 'blueskyweb.xyz:Badge',
|
||||
subject: {did: alice.did, name: 'alice.com'},
|
||||
assertion: {type: 'invite'},
|
||||
createdAt: date.next().value,
|
||||
})
|
||||
const techTagBadge1 = await bob
|
||||
.collection('blueskyweb.xyz:Badges')
|
||||
.create('Badge', {
|
||||
$type: 'blueskyweb.xyz:Badge',
|
||||
subject: {did: alice.did, name: 'alice.com'},
|
||||
assertion: {type: 'tag', tag: 'tech'},
|
||||
createdAt: date.next().value,
|
||||
})
|
||||
const techTagBadge2 = await carla
|
||||
.collection('blueskyweb.xyz:Badges')
|
||||
.create('Badge', {
|
||||
$type: 'blueskyweb.xyz:Badge',
|
||||
subject: {did: alice.did, name: 'alice.com'},
|
||||
assertion: {type: 'tag', tag: 'tech'},
|
||||
createdAt: date.next().value,
|
||||
})
|
||||
await bob.collection('blueskyweb.xyz:Badges').create('Badge', {
|
||||
$type: 'blueskyweb.xyz:Badge',
|
||||
subject: {did: alice.did, name: 'alice.com'},
|
||||
assertion: {type: 'employee'},
|
||||
createdAt: date.next().value,
|
||||
})
|
||||
await alice.collection('blueskyweb.xyz:Profiles').put('Profile', 'profile', {
|
||||
$type: 'blueskyweb.xyz:Profile',
|
||||
displayName: 'Alice',
|
||||
description: 'Test user 1',
|
||||
badges: [
|
||||
{uri: inviteBadge.uri},
|
||||
{uri: techTagBadge1.uri},
|
||||
{uri: techTagBadge2.uri},
|
||||
],
|
||||
})
|
||||
}
|
10
src/state/lib/type-guards.ts
Normal file
10
src/state/lib/type-guards.ts
Normal file
|
@ -0,0 +1,10 @@
|
|||
export function isObj(v: unknown): v is Record<string, unknown> {
|
||||
return !!v && typeof v === 'object'
|
||||
}
|
||||
|
||||
export function hasProp<K extends PropertyKey>(
|
||||
data: object,
|
||||
prop: K,
|
||||
): data is Record<K, unknown> {
|
||||
return prop in data
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue