Initial logic for release notes

Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com>
This commit is contained in:
automated-signal 2024-11-27 19:28:51 -06:00 committed by GitHub
parent e2d12db443
commit e624759003
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 491 additions and 5 deletions

View file

@ -657,6 +657,8 @@ const URL_CALLS = {
callLinkCreateAuth: 'v1/call-link/create-auth',
registration: 'v1/registration',
registerCapabilities: 'v1/devices/capabilities',
releaseNotesManifest: 'dynamic/release-notes/release-notes-v2.json',
releaseNotes: 'static/release-notes',
reportMessage: 'v1/messages/report',
setBackupId: 'v1/archives/backupid',
setBackupSignatureKey: 'v1/archives/keys',
@ -1209,6 +1211,56 @@ export type GetBackupInfoResponseType = z.infer<
typeof getBackupInfoResponseSchema
>;
export type GetReleaseNoteOptionsType = Readonly<{
uuid: string;
}>;
export const releaseNoteSchema = z.object({
uuid: z.string(),
title: z.string(),
body: z.string(),
linkText: z.string().optional(),
callToActionText: z.string().optional(),
includeBoostMessage: z.boolean().optional().default(true),
bodyRanges: z
.array(
z.object({
style: z.string(),
start: z.number(),
length: z.number(),
})
)
.optional(),
media: z.string().optional(),
mediaHeight: z.coerce
.number()
.optional()
.transform(x => x || undefined),
mediaWidth: z.coerce
.number()
.optional()
.transform(x => x || undefined),
mediaContentType: z.string().optional(),
});
export type ReleaseNoteResponseType = z.infer<typeof releaseNoteSchema>;
export const releaseNotesManifestSchema = z.object({
announcements: z
.object({
uuid: z.string(),
countries: z.string().optional(),
desktopMinVersion: z.string().optional(),
link: z.string().optional(),
ctaId: z.string().optional(),
})
.array(),
});
export type ReleaseNotesManifestResponseType = z.infer<
typeof releaseNotesManifestSchema
>;
export type CallLinkCreateAuthResponseType = Readonly<{
credential: string;
}>;
@ -1339,6 +1391,11 @@ export type WebAPIType = {
getSenderCertificate: (
withUuid?: boolean
) => Promise<GetSenderCertificateResultType>;
getReleaseNote: (
options: GetReleaseNoteOptionsType
) => Promise<ReleaseNoteResponseType>;
getReleaseNotesManifest: () => Promise<ReleaseNotesManifestResponseType>;
getReleaseNotesManifestHash: () => Promise<string | undefined>;
getSticker: (packId: string, stickerId: number) => Promise<Uint8Array>;
getStickerPackManifest: (packId: string) => Promise<StickerPackManifestType>;
getStorageCredentials: MessageSender['getStorageCredentials'];
@ -1807,6 +1864,9 @@ export function initialize({
getProfile,
getProfileUnauth,
getProvisioningResource,
getReleaseNote,
getReleaseNotesManifest,
getReleaseNotesManifestHash,
getTransferArchive,
getSenderCertificate,
getSocketStatus,
@ -2099,6 +2159,44 @@ export function initialize({
languages: Record<string, Array<string>>;
};
}
async function getReleaseNote({
uuid,
}: GetReleaseNoteOptionsType): Promise<ReleaseNoteResponseType> {
const rawRes = await _ajax({
call: 'releaseNotes',
host: resourcesUrl,
httpType: 'GET',
responseType: 'json',
urlParameters: `/${uuid}/en.json`,
});
return parseUnknown(releaseNoteSchema, rawRes);
}
async function getReleaseNotesManifest(): Promise<ReleaseNotesManifestResponseType> {
const rawRes = await _ajax({
call: 'releaseNotesManifest',
host: resourcesUrl,
httpType: 'GET',
responseType: 'json',
});
return parseUnknown(releaseNotesManifestSchema, rawRes);
}
async function getReleaseNotesManifestHash(): Promise<string | undefined> {
const { response } = await _ajax({
call: 'releaseNotesManifest',
host: resourcesUrl,
httpType: 'HEAD',
responseType: 'byteswithdetails',
});
const etag = response.headers.get('etag');
if (etag == null) {
return undefined;
}
return etag;
}
async function getStorageManifest(
options: StorageServiceCallOptionsType = {}