1
0
mirror of https://github.com/tooot-app/app synced 2025-06-05 22:19:13 +02:00
This commit is contained in:
xmflsct
2022-12-24 01:59:18 +01:00
parent b6045e5121
commit e27bf7407b
10 changed files with 249 additions and 366 deletions

View File

@ -196,37 +196,19 @@ const TimelineDefault: React.FC<Props> = ({
</ContextMenu.Trigger> </ContextMenu.Trigger>
<ContextMenu.Content> <ContextMenu.Content>
{mShare.map((mGroup, index) => ( {[mShare, mStatus, mInstance].map(type => (
<ContextMenu.Group key={index}> <>
{mGroup.map(menu => ( {type.map((mGroup, index) => (
<ContextMenu.Item key={menu.key} {...menu.item}> <ContextMenu.Group key={index}>
<ContextMenu.ItemTitle children={menu.title} /> {mGroup.map(menu => (
<ContextMenu.ItemIcon iosIconName={menu.icon} /> <ContextMenu.Item key={menu.key} {...menu.item}>
</ContextMenu.Item> <ContextMenu.ItemTitle children={menu.title} />
<ContextMenu.ItemIcon ios={{ name: menu.icon }} />
</ContextMenu.Item>
))}
</ContextMenu.Group>
))} ))}
</ContextMenu.Group> </>
))}
{mStatus.map((mGroup, index) => (
<ContextMenu.Group key={index}>
{mGroup.map(menu => (
<ContextMenu.Item key={menu.key} {...menu.item}>
<ContextMenu.ItemTitle children={menu.title} />
<ContextMenu.ItemIcon iosIconName={menu.icon} />
</ContextMenu.Item>
))}
</ContextMenu.Group>
))}
{mInstance.map((mGroup, index) => (
<ContextMenu.Group key={index}>
{mGroup.map(menu => (
<ContextMenu.Item key={menu.key} {...menu.item}>
<ContextMenu.ItemTitle children={menu.title} />
<ContextMenu.ItemIcon iosIconName={menu.icon} />
</ContextMenu.Item>
))}
</ContextMenu.Group>
))} ))}
</ContextMenu.Content> </ContextMenu.Content>
</ContextMenu.Root> </ContextMenu.Root>

View File

@ -164,37 +164,19 @@ const TimelineNotifications: React.FC<Props> = ({ notification, queryKey }) => {
</ContextMenu.Trigger> </ContextMenu.Trigger>
<ContextMenu.Content> <ContextMenu.Content>
{mShare.map((mGroup, index) => ( {[mShare, mStatus, mInstance].map(type => (
<ContextMenu.Group key={index}> <>
{mGroup.map(menu => ( {type.map((mGroup, index) => (
<ContextMenu.Item key={menu.key} {...menu.item}> <ContextMenu.Group key={index}>
<ContextMenu.ItemTitle children={menu.title} /> {mGroup.map(menu => (
<ContextMenu.ItemIcon iosIconName={menu.icon} /> <ContextMenu.Item key={menu.key} {...menu.item}>
</ContextMenu.Item> <ContextMenu.ItemTitle children={menu.title} />
<ContextMenu.ItemIcon ios={{ name: menu.icon }} />
</ContextMenu.Item>
))}
</ContextMenu.Group>
))} ))}
</ContextMenu.Group> </>
))}
{mStatus.map((mGroup, index) => (
<ContextMenu.Group key={index}>
{mGroup.map(menu => (
<ContextMenu.Item key={menu.key} {...menu.item}>
<ContextMenu.ItemTitle children={menu.title} />
<ContextMenu.ItemIcon iosIconName={menu.icon} />
</ContextMenu.Item>
))}
</ContextMenu.Group>
))}
{mInstance.map((mGroup, index) => (
<ContextMenu.Group key={index}>
{mGroup.map(menu => (
<ContextMenu.Item key={menu.key} {...menu.item}>
<ContextMenu.ItemTitle children={menu.title} />
<ContextMenu.ItemIcon iosIconName={menu.icon} />
</ContextMenu.Item>
))}
</ContextMenu.Group>
))} ))}
</ContextMenu.Content> </ContextMenu.Content>
</ContextMenu.Root> </ContextMenu.Root>

View File

@ -53,34 +53,19 @@ const TimelineHeaderAndroid: React.FC = () => {
</DropdownMenu.Trigger> </DropdownMenu.Trigger>
<DropdownMenu.Content> <DropdownMenu.Content>
{mShare.map((mGroup, index) => ( {[mShare, mAccount, mStatus].map(type => (
<DropdownMenu.Group key={index}> <>
{mGroup.map(menu => ( {type.map((mGroup, index) => (
<DropdownMenu.Item key={menu.key} {...menu.item}> <DropdownMenu.Group key={index}>
<DropdownMenu.ItemTitle children={menu.title} /> {mGroup.map(menu => (
</DropdownMenu.Item> <DropdownMenu.Item key={menu.key} {...menu.item}>
<DropdownMenu.ItemTitle children={menu.title} />
<DropdownMenu.ItemIcon ios={{ name: menu.icon }} />
</DropdownMenu.Item>
))}
</DropdownMenu.Group>
))} ))}
</DropdownMenu.Group> </>
))}
{mAccount.map((mGroup, index) => (
<DropdownMenu.Group key={index}>
{mGroup.map(menu => (
<DropdownMenu.Item key={menu.key} {...menu.item}>
<DropdownMenu.ItemTitle children={menu.title} />
</DropdownMenu.Item>
))}
</DropdownMenu.Group>
))}
{mStatus.map((mGroup, index) => (
<DropdownMenu.Group key={index}>
{mGroup.map(menu => (
<DropdownMenu.Item key={menu.key} {...menu.item}>
<DropdownMenu.ItemTitle children={menu.title} />
</DropdownMenu.Item>
))}
</DropdownMenu.Group>
))} ))}
</DropdownMenu.Content> </DropdownMenu.Content>
</DropdownMenu.Root> </DropdownMenu.Root>

View File

@ -83,37 +83,19 @@ const TimelineHeaderDefault: React.FC = () => {
</DropdownMenu.Trigger> </DropdownMenu.Trigger>
<DropdownMenu.Content> <DropdownMenu.Content>
{mShare.map((mGroup, index) => ( {[mShare, mAccount, mStatus].map(type => (
<DropdownMenu.Group key={index}> <>
{mGroup.map(menu => ( {type.map((mGroup, index) => (
<DropdownMenu.Item key={menu.key} {...menu.item}> <DropdownMenu.Group key={index}>
<DropdownMenu.ItemTitle children={menu.title} /> {mGroup.map(menu => (
<DropdownMenu.ItemIcon iosIconName={menu.icon} /> <DropdownMenu.Item key={menu.key} {...menu.item}>
</DropdownMenu.Item> <DropdownMenu.ItemTitle children={menu.title} />
<DropdownMenu.ItemIcon ios={{ name: menu.icon }} />
</DropdownMenu.Item>
))}
</DropdownMenu.Group>
))} ))}
</DropdownMenu.Group> </>
))}
{mAccount.map((mGroup, index) => (
<DropdownMenu.Group key={index}>
{mGroup.map(menu => (
<DropdownMenu.Item key={menu.key} {...menu.item}>
<DropdownMenu.ItemTitle children={menu.title} />
<DropdownMenu.ItemIcon iosIconName={menu.icon} />
</DropdownMenu.Item>
))}
</DropdownMenu.Group>
))}
{mStatus.map((mGroup, index) => (
<DropdownMenu.Group key={index}>
{mGroup.map(menu => (
<DropdownMenu.Item key={menu.key} {...menu.item}>
<DropdownMenu.ItemTitle children={menu.title} />
<DropdownMenu.ItemIcon iosIconName={menu.icon} />
</DropdownMenu.Item>
))}
</DropdownMenu.Group>
))} ))}
</DropdownMenu.Content> </DropdownMenu.Content>
</DropdownMenu.Root> </DropdownMenu.Root>

View File

@ -90,48 +90,19 @@ const TimelineHeaderNotification: React.FC<Props> = ({ notification }) => {
</DropdownMenu.Trigger> </DropdownMenu.Trigger>
<DropdownMenu.Content> <DropdownMenu.Content>
{mShare.map((mGroup, index) => ( {[mShare, mStatus, mAccount, mInstance].map(type => (
<DropdownMenu.Group key={index}> <>
{mGroup.map(menu => ( {type.map((mGroup, index) => (
<DropdownMenu.Item key={menu.key} {...menu.item}> <DropdownMenu.Group key={index}>
<DropdownMenu.ItemTitle children={menu.title} /> {mGroup.map(menu => (
<DropdownMenu.ItemIcon iosIconName={menu.icon} /> <DropdownMenu.Item key={menu.key} {...menu.item}>
</DropdownMenu.Item> <DropdownMenu.ItemTitle children={menu.title} />
<DropdownMenu.ItemIcon ios={{ name: menu.icon }} />
</DropdownMenu.Item>
))}
</DropdownMenu.Group>
))} ))}
</DropdownMenu.Group> </>
))}
{mAccount.map((mGroup, index) => (
<DropdownMenu.Group key={index}>
{mGroup.map(menu => (
<DropdownMenu.Item key={menu.key} {...menu.item}>
<DropdownMenu.ItemTitle children={menu.title} />
<DropdownMenu.ItemIcon iosIconName={menu.icon} />
</DropdownMenu.Item>
))}
</DropdownMenu.Group>
))}
{mStatus.map((mGroup, index) => (
<DropdownMenu.Group key={index}>
{mGroup.map(menu => (
<DropdownMenu.Item key={menu.key} {...menu.item}>
<DropdownMenu.ItemTitle children={menu.title} />
<DropdownMenu.ItemIcon iosIconName={menu.icon} />
</DropdownMenu.Item>
))}
</DropdownMenu.Group>
))}
{mInstance.map((mGroup, index) => (
<DropdownMenu.Group key={index}>
{mGroup.map(menu => (
<DropdownMenu.Item key={menu.key} {...menu.item}>
<DropdownMenu.ItemTitle children={menu.title} />
<DropdownMenu.ItemIcon iosIconName={menu.icon} />
</DropdownMenu.Item>
))}
</DropdownMenu.Group>
))} ))}
</DropdownMenu.Content> </DropdownMenu.Content>
</DropdownMenu.Root> </DropdownMenu.Root>

View File

@ -62,187 +62,185 @@ const menuStatus = ({
const canEditPost = useSelector(checkInstanceFeature('edit_post')) const canEditPost = useSelector(checkInstanceFeature('edit_post'))
if (ownAccount) { menus.push([
menus.push([ {
{ key: 'status-edit',
key: 'status-edit', item: {
item: { onSelect: async () => {
onSelect: async () => { let replyToStatus: Mastodon.Status | undefined = undefined
let replyToStatus: Mastodon.Status | undefined = undefined if (status.in_reply_to_id) {
if (status.in_reply_to_id) { replyToStatus = await apiInstance<Mastodon.Status>({
replyToStatus = await apiInstance<Mastodon.Status>({
method: 'get',
url: `statuses/${status.in_reply_to_id}`
}).then(res => res.body)
}
apiInstance<{
id: Mastodon.Status['id']
text: NonNullable<Mastodon.Status['text']>
spoiler_text: Mastodon.Status['spoiler_text']
}>({
method: 'get', method: 'get',
url: `statuses/${status.id}/source` url: `statuses/${status.in_reply_to_id}`
}).then(res => { }).then(res => res.body)
navigation.navigate('Screen-Compose', { }
type: 'edit', apiInstance<{
incomingStatus: { id: Mastodon.Status['id']
...status, text: NonNullable<Mastodon.Status['text']>
text: res.body.text, spoiler_text: Mastodon.Status['spoiler_text']
spoiler_text: res.body.spoiler_text }>({
}, method: 'get',
...(replyToStatus && { replyToStatus }), url: `statuses/${status.id}/source`
queryKey, }).then(res => {
rootQueryKey navigation.navigate('Screen-Compose', {
}) type: 'edit',
incomingStatus: {
...status,
text: res.body.text,
spoiler_text: res.body.spoiler_text
},
...(replyToStatus && { replyToStatus }),
queryKey,
rootQueryKey
}) })
}, })
disabled: false,
destructive: false,
hidden: !canEditPost
}, },
title: t('componentContextMenu:status.edit.action'), disabled: false,
icon: 'square.and.pencil' destructive: false,
hidden: !ownAccount || !canEditPost
}, },
{ title: t('componentContextMenu:status.edit.action'),
key: 'status-delete-edit', icon: 'square.and.pencil'
item: { },
onSelect: () => {
Alert.alert( key: 'status-delete-edit',
t('componentContextMenu:status.deleteEdit.alert.title'), item: {
t('componentContextMenu:status.deleteEdit.alert.message'), onSelect: () =>
[ Alert.alert(
{ t('componentContextMenu:status.deleteEdit.alert.title'),
text: t('common:buttons.confirm'), t('componentContextMenu:status.deleteEdit.alert.message'),
style: 'destructive', [
onPress: async () => { {
let replyToStatus: Mastodon.Status | undefined = undefined text: t('common:buttons.confirm'),
if (status.in_reply_to_id) { style: 'destructive',
replyToStatus = await apiInstance<Mastodon.Status>({ onPress: async () => {
method: 'get', let replyToStatus: Mastodon.Status | undefined = undefined
url: `statuses/${status.in_reply_to_id}` if (status.in_reply_to_id) {
}).then(res => res.body) replyToStatus = await apiInstance<Mastodon.Status>({
} method: 'get',
mutation url: `statuses/${status.in_reply_to_id}`
.mutateAsync({ }).then(res => res.body)
type: 'deleteItem',
source: 'statuses',
queryKey,
id: status.id
})
.then(res => {
navigation.navigate('Screen-Compose', {
type: 'deleteEdit',
incomingStatus: res.body as Mastodon.Status,
...(replyToStatus && { replyToStatus }),
queryKey
})
})
} }
}, mutation
{ .mutateAsync({
text: t('common:buttons.cancel')
}
]
),
disabled: false,
destructive: true,
hidden: false
},
title: t('componentContextMenu:status.deleteEdit.action'),
icon: 'pencil.and.outline'
},
{
key: 'status-delete',
item: {
onSelect: () =>
Alert.alert(
t('componentContextMenu:status.delete.alert.title'),
t('componentContextMenu:status.delete.alert.message'),
[
{
text: t('common:buttons.confirm'),
style: 'destructive',
onPress: async () => {
mutation.mutate({
type: 'deleteItem', type: 'deleteItem',
source: 'statuses', source: 'statuses',
queryKey, queryKey,
rootQueryKey,
id: status.id id: status.id
}) })
} .then(res => {
}, navigation.navigate('Screen-Compose', {
{ type: 'deleteEdit',
text: t('common:buttons.cancel'), incomingStatus: res.body as Mastodon.Status,
style: 'default' ...(replyToStatus && { replyToStatus }),
queryKey
})
})
} }
] },
), {
disabled: false, text: t('common:buttons.cancel')
destructive: true,
hidden: false
},
title: t('componentContextMenu:status.delete.action'),
icon: 'trash'
}
])
menus.push([
{
key: 'status-mute',
item: {
onSelect: () =>
mutation.mutate({
type: 'updateStatusProperty',
queryKey,
rootQueryKey,
id: status.id,
payload: {
property: 'muted',
currentValue: status.muted,
propertyCount: undefined,
countValue: undefined
} }
}), ]
disabled: false, ),
destructive: false, disabled: false,
hidden: false destructive: true,
}, hidden: !ownAccount
title: t('componentContextMenu:status.mute.action', {
defaultValue: 'false',
context: (status.muted || false).toString()
}),
icon: status.muted ? 'speaker' : 'speaker.slash'
}, },
{ title: t('componentContextMenu:status.deleteEdit.action'),
key: 'status-pin', icon: 'pencil.and.outline'
item: { },
onSelect: () => {
// Also note that reblogs cannot be pinned. key: 'status-delete',
mutation.mutate({ item: {
type: 'updateStatusProperty', onSelect: () =>
queryKey, Alert.alert(
rootQueryKey, t('componentContextMenu:status.delete.alert.title'),
id: status.id, t('componentContextMenu:status.delete.alert.message'),
payload: { [
property: 'pinned', {
currentValue: status.pinned, text: t('common:buttons.confirm'),
propertyCount: undefined, style: 'destructive',
countValue: undefined onPress: async () => {
mutation.mutate({
type: 'deleteItem',
source: 'statuses',
queryKey,
rootQueryKey,
id: status.id
})
}
},
{
text: t('common:buttons.cancel'),
style: 'default'
} }
}), ]
disabled: false, ),
destructive: false, disabled: false,
hidden: status.visibility !== 'public' && status.visibility !== 'unlisted' destructive: true,
}, hidden: !ownAccount
title: t('componentContextMenu:status.pin.action', { },
defaultValue: 'false', title: t('componentContextMenu:status.delete.action'),
context: (status.pinned || false).toString() icon: 'trash'
}), }
icon: status.pinned ? 'pin.slash' : 'pin' ])
}
]) menus.push([
} {
key: 'status-mute',
item: {
onSelect: () =>
mutation.mutate({
type: 'updateStatusProperty',
queryKey,
rootQueryKey,
id: status.id,
payload: {
property: 'muted',
currentValue: status.muted
}
}),
disabled: false,
destructive: false,
hidden:
!ownAccount &&
!status.mentions.filter(mention => mention.id === instanceAccount.id).length
},
title: t('componentContextMenu:status.mute.action', {
defaultValue: 'false',
context: (status.muted || false).toString()
}),
icon: status.muted ? 'speaker' : 'speaker.slash'
},
{
key: 'status-pin',
item: {
onSelect: () =>
// Also note that reblogs cannot be pinned.
mutation.mutate({
type: 'updateStatusProperty',
queryKey,
rootQueryKey,
id: status.id,
payload: {
property: 'pinned',
currentValue: status.pinned,
propertyCount: undefined,
countValue: undefined
}
}),
disabled: false,
destructive: false,
hidden: !ownAccount || (status.visibility !== 'public' && status.visibility !== 'unlisted')
},
title: t('componentContextMenu:status.pin.action', {
defaultValue: 'false',
context: (status.pinned || false).toString()
}),
icon: status.pinned ? 'pin.slash' : 'pin'
}
])
return menus return menus
} }

View File

@ -96,7 +96,7 @@ const Root: React.FC<NativeStackScreenProps<TabLocalStackParamList, 'Tab-Local-R
disabled={page.page === 'Following'} disabled={page.page === 'Following'}
> >
<DropdownMenu.ItemTitle children={t('tabs.local.name')} /> <DropdownMenu.ItemTitle children={t('tabs.local.name')} />
<DropdownMenu.ItemIcon iosIconName='house' /> <DropdownMenu.ItemIcon ios={{ name: 'house' }} />
</DropdownMenu.Item> </DropdownMenu.Item>
<DropdownMenu.CheckboxItem <DropdownMenu.CheckboxItem
key='showBoosts' key='showBoosts'
@ -157,7 +157,7 @@ const Root: React.FC<NativeStackScreenProps<TabLocalStackParamList, 'Tab-Local-R
].map(menu => ( ].map(menu => (
<DropdownMenu.Item key={menu.key} {...menu.item}> <DropdownMenu.Item key={menu.key} {...menu.item}>
<DropdownMenu.ItemTitle children={menu.title} /> <DropdownMenu.ItemTitle children={menu.title} />
<DropdownMenu.ItemIcon iosIconName={menu.icon} /> <DropdownMenu.ItemIcon ios={{ name: menu.icon }} />
</DropdownMenu.Item> </DropdownMenu.Item>
)) ))
: undefined} : undefined}

View File

@ -55,24 +55,14 @@ const TabMeList: React.FC<TabMeStackScreenProps<'Tab-Me-List'>> = ({
</DropdownMenu.Trigger> </DropdownMenu.Trigger>
<DropdownMenu.Content> <DropdownMenu.Content>
<DropdownMenu.Group> {[listAccounts, listEdit, listDelete].map((menu, index) => (
<DropdownMenu.Item key={listAccounts.key} onSelect={listAccounts.onSelect}> <DropdownMenu.Group key={index}>
<DropdownMenu.ItemTitle children={listAccounts.title} /> <DropdownMenu.Item key={menu.key} onSelect={menu.onSelect}>
<DropdownMenu.ItemIcon iosIconName={listAccounts.icon} /> <DropdownMenu.ItemTitle children={menu.title} />
</DropdownMenu.Item> <DropdownMenu.ItemIcon ios={{ name: menu.icon }} />
</DropdownMenu.Group> </DropdownMenu.Item>
</DropdownMenu.Group>
<DropdownMenu.Group> ))}
<DropdownMenu.Item key={listEdit.key} onSelect={listEdit.onSelect}>
<DropdownMenu.ItemTitle children={listEdit.title} />
<DropdownMenu.ItemIcon iosIconName={listEdit.icon} />
</DropdownMenu.Item>
<DropdownMenu.Item key={listDelete.key} destructive onSelect={listDelete.onSelect}>
<DropdownMenu.ItemTitle children={listDelete.title} />
<DropdownMenu.ItemIcon iosIconName={listDelete.icon} />
</DropdownMenu.Item>
</DropdownMenu.Group>
</DropdownMenu.Content> </DropdownMenu.Content>
</DropdownMenu.Root> </DropdownMenu.Root>
) )

View File

@ -55,26 +55,19 @@ const TabSharedAccount: React.FC<TabSharedStackScreenProps<'Tab-Shared-Account'>
</DropdownMenu.Trigger> </DropdownMenu.Trigger>
<DropdownMenu.Content> <DropdownMenu.Content>
{mShare.map((mGroup, index) => ( {[mShare, mAccount].map(type => (
<DropdownMenu.Group key={index}> <>
{mGroup.map(menu => ( {type.map((mGroup, index) => (
<DropdownMenu.Item key={menu.key} {...menu.item}> <DropdownMenu.Group key={index}>
<DropdownMenu.ItemTitle children={menu.title} /> {mGroup.map(menu => (
<DropdownMenu.ItemIcon iosIconName={menu.icon} /> <DropdownMenu.Item key={menu.key} {...menu.item}>
</DropdownMenu.Item> <DropdownMenu.ItemTitle children={menu.title} />
<DropdownMenu.ItemIcon ios={{ name: menu.icon }} />
</DropdownMenu.Item>
))}
</DropdownMenu.Group>
))} ))}
</DropdownMenu.Group> </>
))}
{mAccount.map((mGroup, index) => (
<DropdownMenu.Group key={index}>
{mGroup.map(menu => (
<DropdownMenu.Item key={menu.key} {...menu.item}>
<DropdownMenu.ItemTitle children={menu.title} />
<DropdownMenu.ItemIcon iosIconName={menu.icon} />
</DropdownMenu.Item>
))}
</DropdownMenu.Group>
))} ))}
</DropdownMenu.Content> </DropdownMenu.Content>
</DropdownMenu.Root> </DropdownMenu.Root>

View File

@ -273,8 +273,8 @@ export type MutationVarsTimelineUpdateStatusProperty = {
| { | {
property: 'bookmarked' | 'muted' | 'pinned' property: 'bookmarked' | 'muted' | 'pinned'
currentValue: boolean currentValue: boolean
propertyCount: undefined propertyCount?: undefined
countValue: undefined countValue?: undefined
} }
| { | {
property: 'favourited' property: 'favourited'