@communecter/cocolight-api-client 1.0.154 → 1.0.156
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/1035.cocolight-api-client.browser.js +1 -1
- package/dist/1035.cocolight-api-client.cjs +1 -1
- package/dist/1483.cocolight-api-client.browser.js +1 -1
- package/dist/1483.cocolight-api-client.cjs +1 -1
- package/dist/1491.cocolight-api-client.browser.js +1 -1
- package/dist/1491.cocolight-api-client.cjs +1 -1
- package/dist/1494.cocolight-api-client.browser.js +1 -1
- package/dist/1494.cocolight-api-client.cjs +1 -1
- package/dist/1641.cocolight-api-client.browser.js +1 -1
- package/dist/1641.cocolight-api-client.cjs +1 -1
- package/dist/1678.cocolight-api-client.browser.js +1 -1
- package/dist/1678.cocolight-api-client.cjs +1 -1
- package/dist/2041.cocolight-api-client.browser.js +1 -1
- package/dist/2041.cocolight-api-client.cjs +1 -1
- package/dist/2302.cocolight-api-client.browser.js +1 -1
- package/dist/2302.cocolight-api-client.cjs +1 -1
- package/dist/2313.cocolight-api-client.browser.js +1 -1
- package/dist/2313.cocolight-api-client.cjs +1 -1
- package/dist/2379.cocolight-api-client.browser.js +1 -1
- package/dist/2379.cocolight-api-client.cjs +1 -1
- package/dist/2439.cocolight-api-client.browser.js +1 -1
- package/dist/2439.cocolight-api-client.cjs +1 -1
- package/dist/2594.cocolight-api-client.browser.js +1 -1
- package/dist/2594.cocolight-api-client.cjs +1 -1
- package/dist/2766.cocolight-api-client.browser.js +1 -1
- package/dist/2766.cocolight-api-client.cjs +1 -1
- package/dist/2812.cocolight-api-client.browser.js +1 -1
- package/dist/2812.cocolight-api-client.cjs +1 -1
- package/dist/2918.cocolight-api-client.browser.js +1 -1
- package/dist/2918.cocolight-api-client.cjs +1 -1
- package/dist/3028.cocolight-api-client.browser.js +1 -1
- package/dist/3028.cocolight-api-client.cjs +1 -1
- package/dist/3330.cocolight-api-client.browser.js +1 -1
- package/dist/3330.cocolight-api-client.cjs +1 -1
- package/dist/3371.cocolight-api-client.browser.js +1 -1
- package/dist/3371.cocolight-api-client.cjs +1 -1
- package/dist/3401.cocolight-api-client.browser.js +1 -1
- package/dist/3401.cocolight-api-client.cjs +1 -1
- package/dist/3516.cocolight-api-client.browser.js +1 -1
- package/dist/3516.cocolight-api-client.cjs +1 -1
- package/dist/3593.cocolight-api-client.browser.js +1 -1
- package/dist/3593.cocolight-api-client.cjs +1 -1
- package/dist/3764.cocolight-api-client.browser.js +1 -1
- package/dist/3764.cocolight-api-client.cjs +1 -1
- package/dist/3873.cocolight-api-client.browser.js +1 -1
- package/dist/3873.cocolight-api-client.cjs +1 -1
- package/dist/3911.cocolight-api-client.browser.js +1 -1
- package/dist/3911.cocolight-api-client.cjs +1 -1
- package/dist/4031.cocolight-api-client.browser.js +1 -1
- package/dist/4031.cocolight-api-client.cjs +1 -1
- package/dist/4152.cocolight-api-client.browser.js +1 -1
- package/dist/4152.cocolight-api-client.cjs +1 -1
- package/dist/4203.cocolight-api-client.browser.js +1 -1
- package/dist/4203.cocolight-api-client.cjs +1 -1
- package/dist/424.cocolight-api-client.browser.js +1 -1
- package/dist/424.cocolight-api-client.cjs +1 -1
- package/dist/435.cocolight-api-client.browser.js +1 -1
- package/dist/435.cocolight-api-client.cjs +1 -1
- package/dist/4402.cocolight-api-client.browser.js +1 -1
- package/dist/4402.cocolight-api-client.cjs +1 -1
- package/dist/4425.cocolight-api-client.browser.js +1 -1
- package/dist/4425.cocolight-api-client.cjs +1 -1
- package/dist/4472.cocolight-api-client.browser.js +1 -1
- package/dist/4472.cocolight-api-client.cjs +1 -1
- package/dist/4914.cocolight-api-client.browser.js +1 -1
- package/dist/4914.cocolight-api-client.cjs +1 -1
- package/dist/4959.cocolight-api-client.browser.js +1 -1
- package/dist/4959.cocolight-api-client.cjs +1 -1
- package/dist/5100.cocolight-api-client.browser.js +1 -1
- package/dist/5100.cocolight-api-client.cjs +1 -1
- package/dist/5111.cocolight-api-client.browser.js +1 -1
- package/dist/5111.cocolight-api-client.cjs +1 -1
- package/dist/5286.cocolight-api-client.browser.js +1 -1
- package/dist/5286.cocolight-api-client.cjs +1 -1
- package/dist/5380.cocolight-api-client.browser.js +1 -1
- package/dist/5380.cocolight-api-client.cjs +1 -1
- package/dist/5383.cocolight-api-client.browser.js +1 -1
- package/dist/5383.cocolight-api-client.cjs +1 -1
- package/dist/5480.cocolight-api-client.browser.js +1 -1
- package/dist/5480.cocolight-api-client.cjs +1 -1
- package/dist/5541.cocolight-api-client.browser.js +1 -1
- package/dist/5541.cocolight-api-client.cjs +1 -1
- package/dist/5839.cocolight-api-client.browser.js +1 -1
- package/dist/5839.cocolight-api-client.cjs +1 -1
- package/dist/5862.cocolight-api-client.browser.js +1 -1
- package/dist/5862.cocolight-api-client.cjs +1 -1
- package/dist/5869.cocolight-api-client.browser.js +1 -1
- package/dist/5869.cocolight-api-client.cjs +1 -1
- package/dist/588.cocolight-api-client.browser.js +1 -1
- package/dist/588.cocolight-api-client.cjs +1 -1
- package/dist/601.cocolight-api-client.browser.js +1 -1
- package/dist/601.cocolight-api-client.cjs +1 -1
- package/dist/6012.cocolight-api-client.browser.js +1 -1
- package/dist/6012.cocolight-api-client.cjs +1 -1
- package/dist/6200.cocolight-api-client.browser.js +1 -1
- package/dist/6200.cocolight-api-client.cjs +1 -1
- package/dist/6369.cocolight-api-client.browser.js +1 -1
- package/dist/6369.cocolight-api-client.cjs +1 -1
- package/dist/7009.cocolight-api-client.browser.js +1 -1
- package/dist/7009.cocolight-api-client.cjs +1 -1
- package/dist/725.cocolight-api-client.browser.js +1 -1
- package/dist/725.cocolight-api-client.cjs +1 -1
- package/dist/7320.cocolight-api-client.browser.js +1 -1
- package/dist/7339.cocolight-api-client.browser.js +1 -1
- package/dist/7339.cocolight-api-client.cjs +1 -1
- package/dist/7398.cocolight-api-client.browser.js +1 -1
- package/dist/7398.cocolight-api-client.cjs +1 -1
- package/dist/7888.cocolight-api-client.browser.js +1 -1
- package/dist/7888.cocolight-api-client.cjs +1 -1
- package/dist/7975.cocolight-api-client.browser.js +1 -1
- package/dist/7975.cocolight-api-client.cjs +1 -1
- package/dist/809.cocolight-api-client.browser.js +1 -1
- package/dist/809.cocolight-api-client.cjs +1 -1
- package/dist/8300.cocolight-api-client.browser.js +1 -1
- package/dist/8300.cocolight-api-client.cjs +1 -1
- package/dist/8317.cocolight-api-client.browser.js +1 -1
- package/dist/8317.cocolight-api-client.cjs +1 -1
- package/dist/8525.cocolight-api-client.browser.js +1 -1
- package/dist/8525.cocolight-api-client.cjs +1 -1
- package/dist/8894.cocolight-api-client.browser.js +1 -1
- package/dist/8894.cocolight-api-client.cjs +1 -1
- package/dist/9301.cocolight-api-client.browser.js +1 -1
- package/dist/9301.cocolight-api-client.cjs +1 -1
- package/dist/9438.cocolight-api-client.browser.js +1 -1
- package/dist/9438.cocolight-api-client.cjs +1 -1
- package/dist/9478.cocolight-api-client.browser.js +1 -1
- package/dist/9478.cocolight-api-client.cjs +1 -1
- package/dist/9568.cocolight-api-client.browser.js +1 -1
- package/dist/9568.cocolight-api-client.cjs +1 -1
- package/dist/cocolight-api-client.browser.js +6 -6
- package/dist/cocolight-api-client.cjs +1 -1
- package/dist/cocolight-api-client.vite.mjs.js +1 -1
- package/dist/cocolight-api-client.vite.mjs.js.map +1 -1
- package/package.json +7 -17
- package/types/Api.d.ts +1 -0
- package/types/ApiClient.d.ts +10 -1
- package/types/api/BaseEntity.d.ts +24 -0
- package/types/api/EndpointApi.d.ts +4 -4
- package/types/api/EndpointApi.types.d.ts +3 -3
- package/types/utils/OfflineClientManager.d.ts +8 -0
- package/dist/1035.cocolight-api-client.mjs.js +0 -1
- package/dist/1483.cocolight-api-client.mjs.js +0 -1
- package/dist/1491.cocolight-api-client.mjs.js +0 -1
- package/dist/1494.cocolight-api-client.mjs.js +0 -1
- package/dist/1641.cocolight-api-client.mjs.js +0 -1
- package/dist/1678.cocolight-api-client.mjs.js +0 -1
- package/dist/2041.cocolight-api-client.mjs.js +0 -1
- package/dist/2302.cocolight-api-client.mjs.js +0 -1
- package/dist/2313.cocolight-api-client.mjs.js +0 -1
- package/dist/2379.cocolight-api-client.mjs.js +0 -1
- package/dist/2439.cocolight-api-client.mjs.js +0 -1
- package/dist/2594.cocolight-api-client.mjs.js +0 -1
- package/dist/2766.cocolight-api-client.mjs.js +0 -1
- package/dist/2812.cocolight-api-client.mjs.js +0 -1
- package/dist/2918.cocolight-api-client.mjs.js +0 -1
- package/dist/3028.cocolight-api-client.mjs.js +0 -1
- package/dist/3330.cocolight-api-client.mjs.js +0 -1
- package/dist/3371.cocolight-api-client.mjs.js +0 -1
- package/dist/3401.cocolight-api-client.mjs.js +0 -1
- package/dist/3516.cocolight-api-client.mjs.js +0 -1
- package/dist/3593.cocolight-api-client.mjs.js +0 -1
- package/dist/3764.cocolight-api-client.mjs.js +0 -1
- package/dist/3873.cocolight-api-client.mjs.js +0 -1
- package/dist/3911.cocolight-api-client.mjs.js +0 -1
- package/dist/4031.cocolight-api-client.mjs.js +0 -1
- package/dist/4152.cocolight-api-client.mjs.js +0 -1
- package/dist/4203.cocolight-api-client.mjs.js +0 -1
- package/dist/424.cocolight-api-client.mjs.js +0 -1
- package/dist/435.cocolight-api-client.mjs.js +0 -1
- package/dist/4402.cocolight-api-client.mjs.js +0 -1
- package/dist/4425.cocolight-api-client.mjs.js +0 -1
- package/dist/4472.cocolight-api-client.mjs.js +0 -1
- package/dist/4914.cocolight-api-client.mjs.js +0 -1
- package/dist/4959.cocolight-api-client.mjs.js +0 -1
- package/dist/5100.cocolight-api-client.mjs.js +0 -1
- package/dist/5111.cocolight-api-client.mjs.js +0 -1
- package/dist/5286.cocolight-api-client.mjs.js +0 -1
- package/dist/5380.cocolight-api-client.mjs.js +0 -1
- package/dist/5383.cocolight-api-client.mjs.js +0 -1
- package/dist/5480.cocolight-api-client.mjs.js +0 -1
- package/dist/5541.cocolight-api-client.mjs.js +0 -1
- package/dist/5839.cocolight-api-client.mjs.js +0 -1
- package/dist/5862.cocolight-api-client.mjs.js +0 -1
- package/dist/5869.cocolight-api-client.mjs.js +0 -1
- package/dist/588.cocolight-api-client.mjs.js +0 -1
- package/dist/601.cocolight-api-client.mjs.js +0 -1
- package/dist/6012.cocolight-api-client.mjs.js +0 -1
- package/dist/6200.cocolight-api-client.mjs.js +0 -1
- package/dist/6369.cocolight-api-client.mjs.js +0 -1
- package/dist/7009.cocolight-api-client.mjs.js +0 -1
- package/dist/725.cocolight-api-client.mjs.js +0 -1
- package/dist/7339.cocolight-api-client.mjs.js +0 -1
- package/dist/7398.cocolight-api-client.mjs.js +0 -1
- package/dist/7888.cocolight-api-client.mjs.js +0 -1
- package/dist/7975.cocolight-api-client.mjs.js +0 -1
- package/dist/809.cocolight-api-client.mjs.js +0 -1
- package/dist/8300.cocolight-api-client.mjs.js +0 -1
- package/dist/8317.cocolight-api-client.mjs.js +0 -1
- package/dist/8525.cocolight-api-client.mjs.js +0 -1
- package/dist/8894.cocolight-api-client.mjs.js +0 -1
- package/dist/9301.cocolight-api-client.mjs.js +0 -1
- package/dist/9438.cocolight-api-client.mjs.js +0 -1
- package/dist/9478.cocolight-api-client.mjs.js +0 -1
- package/dist/9568.cocolight-api-client.mjs.js +0 -1
- package/dist/cocolight-api-client.mjs.js +0 -1
- package/src/Api.ts +0 -348
- package/src/ApiClient.ts +0 -1994
- package/src/EJSONType.ts +0 -103
- package/src/api/Action.ts +0 -665
- package/src/api/Answer.ts +0 -1392
- package/src/api/Badge.ts +0 -143
- package/src/api/BaseEntity.ts +0 -6338
- package/src/api/Classified.ts +0 -175
- package/src/api/Comment.ts +0 -280
- package/src/api/EndpointApi.ts +0 -2270
- package/src/api/EndpointApi.types.ts +0 -6566
- package/src/api/EntityRegistry.ts +0 -324
- package/src/api/Event.ts +0 -360
- package/src/api/Form.ts +0 -282
- package/src/api/News.ts +0 -547
- package/src/api/Notifications.ts +0 -196
- package/src/api/Organization.ts +0 -771
- package/src/api/Poi.ts +0 -242
- package/src/api/Project.ts +0 -545
- package/src/api/User.ts +0 -1889
- package/src/api/UserApi.ts +0 -192
- package/src/api/serverDataType/Action.ts +0 -177
- package/src/api/serverDataType/Answer.ts +0 -106
- package/src/api/serverDataType/Classified.ts +0 -152
- package/src/api/serverDataType/Comment.ts +0 -88
- package/src/api/serverDataType/Country.ts +0 -1
- package/src/api/serverDataType/Event.ts +0 -112
- package/src/api/serverDataType/Form.ts +0 -157
- package/src/api/serverDataType/News.ts +0 -138
- package/src/api/serverDataType/Notification.ts +0 -81
- package/src/api/serverDataType/Organization.ts +0 -111
- package/src/api/serverDataType/Poi.ts +0 -75
- package/src/api/serverDataType/Project.ts +0 -115
- package/src/api/serverDataType/User.ts +0 -112
- package/src/api/serverDataType/Zone.ts +0 -33
- package/src/api/serverDataType/common.ts +0 -84
- package/src/costum/normalize.ts +0 -7
- package/src/costum/registry.ts +0 -138
- package/src/costum/runtime-map.ts +0 -221
- package/src/costum/runtime.ts +0 -274
- package/src/costum/schemas/CercleTravailleursSociauxLiberauxLaPlumeSociale.ts +0 -19
- package/src/costum/schemas/FabEn.ts +0 -19
- package/src/costum/schemas/LivingLabInnovationSocialeBraspanon.ts +0 -19
- package/src/costum/schemas/alfph.ts +0 -27
- package/src/costum/schemas/campagne.ts +0 -19
- package/src/costum/schemas/chtitube.ts +0 -19
- package/src/costum/schemas/circuitCourt.ts +0 -19
- package/src/costum/schemas/cmcasHauteBretagne.ts +0 -19
- package/src/costum/schemas/coFinancementTierslieux.ts +0 -27
- package/src/costum/schemas/coeurNumerique.ts +0 -19
- package/src/costum/schemas/communLundi.ts +0 -19
- package/src/costum/schemas/cressReunion.ts +0 -35
- package/src/costum/schemas/cressReunionNetwork.ts +0 -35
- package/src/costum/schemas/ctenat.ts +0 -43
- package/src/costum/schemas/cyberReunion.ts +0 -19
- package/src/costum/schemas/ekisphere.ts +0 -35
- package/src/costum/schemas/equipementsSportifs974.ts +0 -19
- package/src/costum/schemas/federationDesCae.ts +0 -19
- package/src/costum/schemas/formationGenerique.ts +0 -35
- package/src/costum/schemas/franceTierslieux.ts +0 -19
- package/src/costum/schemas/hinaura.ts +0 -27
- package/src/costum/schemas/hubmayotte.ts +0 -19
- package/src/costum/schemas/hubnouvellecaledonie.ts +0 -19
- package/src/costum/schemas/hubpolynesiefrancaise.ts +0 -19
- package/src/costum/schemas/hubreunion.ts +0 -19
- package/src/costum/schemas/hubterritoires.ts +0 -19
- package/src/costum/schemas/hubwallisetfutuna.ts +0 -19
- package/src/costum/schemas/hva.ts +0 -27
- package/src/costum/schemas/ibv2.ts +0 -19
- package/src/costum/schemas/institutBleu.ts +0 -19
- package/src/costum/schemas/journalInsoumisChambery.ts +0 -27
- package/src/costum/schemas/kpacite.ts +0 -19
- package/src/costum/schemas/laCompagnieDesTierslieux.ts +0 -43
- package/src/costum/schemas/laMaisonDesFaiseurs.ts +0 -19
- package/src/costum/schemas/laReunionPourUnNumeriqueInclusif.ts +0 -19
- package/src/costum/schemas/laSemaineDesTierslieux.ts +0 -19
- package/src/costum/schemas/labEnCommuns.ts +0 -19
- package/src/costum/schemas/lakou.ts +0 -27
- package/src/costum/schemas/lesCommunsDesTierslieux.ts +0 -19
- package/src/costum/schemas/mayottePourUnNumeriqueInclusif.ts +0 -19
- package/src/costum/schemas/meir.ts +0 -27
- package/src/costum/schemas/navigatorDesTierslieux.ts +0 -19
- package/src/costum/schemas/notragora.ts +0 -27
- package/src/costum/schemas/nouvellecaledoniePourUnNumeriqueInclusif.ts +0 -19
- package/src/costum/schemas/openAtlas.ts +0 -19
- package/src/costum/schemas/polynesieFrancaisePourUnNumeriqueInclusif.ts +0 -19
- package/src/costum/schemas/prdr.ts +0 -19
- package/src/costum/schemas/reseauTierslieux.ts +0 -19
- package/src/costum/schemas/rfflabs.ts +0 -19
- package/src/costum/schemas/ries.ts +0 -19
- package/src/costum/schemas/siteDuPactePourLaTransition.ts +0 -27
- package/src/costum/schemas/sportSanteBienetre.ts +0 -43
- package/src/costum/schemas/suppa.ts +0 -19
- package/src/costum/schemas/terramies.ts +0 -19
- package/src/costum/schemas/testeTplFormation.ts +0 -35
- package/src/costum/schemas/tierslieuxbelgique.ts +0 -19
- package/src/costum/schemas/tierslieuxorg1.ts +0 -35
- package/src/costum/schemas/transiter.ts +0 -35
- package/src/costum/schemas/vhelioPeiTour2025.ts +0 -19
- package/src/costum/schemas/wallisetfutunaPourUnNumeriqueInclusif.ts +0 -19
- package/src/costum/symbol.ts +0 -26
- package/src/costum/types.ts +0 -895
- package/src/endpoints.module.ts +0 -4253
- package/src/error.ts +0 -86
- package/src/forms/entityForm.ts +0 -142
- package/src/index.ts +0 -161
- package/src/mixin/UserMixin.ts +0 -4
- package/src/types/api-responses.ts +0 -217
- package/src/types/entities.ts +0 -58
- package/src/types/error-guards.ts +0 -230
- package/src/types/index.ts +0 -41
- package/src/types/payloads.ts +0 -21
- package/src/types/transforms.ts +0 -119
- package/src/utils/FileOfflineStorageStrategy.node.ts +0 -50
- package/src/utils/FileStorageStrategy.node.ts +0 -63
- package/src/utils/MultiServerFileStorageStrategy.node.ts +0 -67
- package/src/utils/MultiServerTokenStorageStrategy.ts +0 -139
- package/src/utils/OfflineClientManager.ts +0 -216
- package/src/utils/OfflineQueueStorageStrategy.ts +0 -47
- package/src/utils/TokenStorage.ts +0 -77
- package/src/utils/compat.ts +0 -12
- package/src/utils/createDefaultMultiServerTokenStorageStrategy.ts +0 -35
- package/src/utils/createDefaultOfflineStrategy.ts +0 -34
- package/src/utils/createDefaultTokenStorageStrategy.ts +0 -33
- package/src/utils/reactive.ts +0 -243
- package/src/utils/stream-utils.node.ts +0 -12
package/src/api/Notifications.ts
DELETED
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
import { batch, reactive } from "../utils/reactive.js";
|
|
2
|
-
|
|
3
|
-
import type {
|
|
4
|
-
NotificationAuthor,
|
|
5
|
-
NotificationItemData
|
|
6
|
-
} from "./serverDataType/Notification.js";
|
|
7
|
-
|
|
8
|
-
type User = import("./User.js").User; // backref ; User porte __entityTag donc non proxifié par reactive()
|
|
9
|
-
|
|
10
|
-
/** Taille de page côté serveur (ActivityStream::getNotificationsByStep indexStep=15). */
|
|
11
|
-
const DEFAULT_PAGE_SIZE = 15;
|
|
12
|
-
|
|
13
|
-
/** isUnread/isUnseen de CE destinataire (le serveur unset la clé quand lu/vu -> absence = faux). */
|
|
14
|
-
function stateFor(data: NotificationItemData, userId: string | null, key: "isUnread" | "isUnseen"): boolean {
|
|
15
|
-
if (!userId) return false;
|
|
16
|
-
return data?.notify?.id?.[userId]?.[key] === true;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Item de notification fin. N'étend PAS BaseEntity : il garde la donnée brute, un backref
|
|
21
|
-
* User (pour router les appels via callIsMe + endpointApi) et un backref manager (pour le recount).
|
|
22
|
-
* Les drapeaux lu/vu sont réactifs (objet reactive({...}) — surface scalaire fiable).
|
|
23
|
-
*/
|
|
24
|
-
export class Notification {
|
|
25
|
-
private readonly _data: NotificationItemData;
|
|
26
|
-
private readonly _owner: User;
|
|
27
|
-
private _manager: Notifications | null;
|
|
28
|
-
private readonly _state: { isUnread: boolean; isUnseen: boolean };
|
|
29
|
-
|
|
30
|
-
constructor(data: NotificationItemData, owner: User, manager: Notifications | null = null) {
|
|
31
|
-
this._data = data;
|
|
32
|
-
this._owner = owner;
|
|
33
|
-
this._manager = manager;
|
|
34
|
-
const uid = owner.userId;
|
|
35
|
-
this._state = reactive({
|
|
36
|
-
isUnread: stateFor(data, uid, "isUnread"),
|
|
37
|
-
isUnseen: stateFor(data, uid, "isUnseen")
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
static fromData(data: NotificationItemData, owner: User, manager: Notifications | null = null): Notification {
|
|
42
|
-
return new Notification(data, owner, manager);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** Lie l'item à son manager (appelé par le manager au wrap). */
|
|
46
|
-
_attach(manager: Notifications): this { this._manager = manager; return this; }
|
|
47
|
-
|
|
48
|
-
get id(): string { return this._data.id; } // injecté par ApiClient._transformData (clé de la map = hex)
|
|
49
|
-
get isUnread(): boolean { return this._state.isUnread; } // lecture réactive
|
|
50
|
-
get isUnseen(): boolean { return this._state.isUnseen; }
|
|
51
|
-
get data(): NotificationItemData { return this._data; }
|
|
52
|
-
get author(): NotificationAuthor { return this._data.author; }
|
|
53
|
-
get createdAt(): Date {
|
|
54
|
-
// ApiClient._transformData rend `created` en Date. La string ISO survient après un
|
|
55
|
-
// round-trip toJSON()->JSON.parse->restore(). On fait confiance à la normalisation amont.
|
|
56
|
-
const c = this._data.created;
|
|
57
|
-
return c instanceof Date ? c : new Date(c as string | number);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// setters locaux (utilisés par l'optimiste, sans appel réseau)
|
|
61
|
-
_setReadLocal(): void { this._state.isUnread = false; }
|
|
62
|
-
_setSeenLocal(): void { this._state.isUnseen = false; }
|
|
63
|
-
_restoreLocal(unread: boolean, unseen: boolean): void { this._state.isUnread = unread; this._state.isUnseen = unseen; }
|
|
64
|
-
|
|
65
|
-
/** Marque CET item comme lu : optimiste + rollback + recount manager. */
|
|
66
|
-
async markRead(): Promise<void> {
|
|
67
|
-
if (!this._state.isUnread) return;
|
|
68
|
-
const pu = this._state.isUnread, ps = this._state.isUnseen;
|
|
69
|
-
this._setReadLocal();
|
|
70
|
-
this._manager?._recount();
|
|
71
|
-
try {
|
|
72
|
-
await this._owner.markNotificationAsRead(this.id);
|
|
73
|
-
} catch (err) {
|
|
74
|
-
this._restoreLocal(pu, ps);
|
|
75
|
-
this._manager?._recount();
|
|
76
|
-
throw err;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/** Pas d'endpoint "seen" par item : flip local uniquement. */
|
|
81
|
-
markSeen(): void { this._setSeenLocal(); this._manager?._recount(); }
|
|
82
|
-
|
|
83
|
-
toJSON(): NotificationItemData { return this._data; }
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Gestionnaire de notifications de l'utilisateur connecté. Accroché à User via `me.notifications`.
|
|
88
|
-
* N'étend PAS BaseEntity. Items dans un tableau SIMPLE (jamais proxifié) ; seuls les scalaires
|
|
89
|
-
* vivent dans un reactive({...}) (loadedUnreadCount, unseenTotal, cursor, hasMore, version).
|
|
90
|
-
* Aucun effect/computed créé ici (pas d'API de dispose -> pas de fuite).
|
|
91
|
-
*/
|
|
92
|
-
export class Notifications {
|
|
93
|
-
private readonly _owner: User;
|
|
94
|
-
private readonly _pageSize: number;
|
|
95
|
-
private _items: Notification[] = [];
|
|
96
|
-
private readonly _state: {
|
|
97
|
-
loadedUnreadCount: number; // non-lus PARMI les items chargés (dérivé)
|
|
98
|
-
unseenTotal: number; // total NON-VUS côté serveur (countNotif) — badge cloche
|
|
99
|
-
cursor: number; // offset indexMin (nb d'items déjà chargés)
|
|
100
|
-
hasMore: boolean;
|
|
101
|
-
version: number; // bump à chaque mutation de liste -> réactivité de `items`
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
constructor(owner: User, pageSize: number = DEFAULT_PAGE_SIZE) {
|
|
105
|
-
this._owner = owner;
|
|
106
|
-
this._pageSize = pageSize;
|
|
107
|
-
this._state = reactive({ loadedUnreadCount: 0, unseenTotal: 0, cursor: 0, hasMore: true, version: 0 });
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// surface réactive consommateur
|
|
111
|
-
get items(): Notification[] { void this._state.version; return this._items; }
|
|
112
|
-
get loadedUnreadCount(): number { return this._state.loadedUnreadCount; }
|
|
113
|
-
get unseenTotal(): number { return this._state.unseenTotal; } // badge "non vus"
|
|
114
|
-
get hasMore(): boolean { return this._state.hasMore; }
|
|
115
|
-
|
|
116
|
-
_recount(): void { this._state.loadedUnreadCount = this._items.filter((n) => n.isUnread).length; }
|
|
117
|
-
private _wrap(raw: NotificationItemData[]): Notification[] { return raw.map((d) => Notification.fromData(d, this._owner, this)); }
|
|
118
|
-
private _commit(items: Notification[]): void { this._items = items; this._state.version++; this._recount(); }
|
|
119
|
-
|
|
120
|
-
/** Première page (reset le curseur). Tri serveur : updated desc, 15/page. */
|
|
121
|
-
async list({ indexMin = 0 }: { indexMin?: number } = {}): Promise<Notification[]> {
|
|
122
|
-
const next = this._wrap(await this._owner.fetchNotifications({ indexMin }));
|
|
123
|
-
this._commit(next);
|
|
124
|
-
this._state.cursor = next.length;
|
|
125
|
-
this._state.hasMore = next.length >= this._pageSize;
|
|
126
|
-
return next;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/** Page suivante (curseur indexMin = nb d'items déjà chargés). Concatène par réassignation. */
|
|
130
|
-
async loadMore(): Promise<Notification[]> {
|
|
131
|
-
if (!this._state.hasMore) return [];
|
|
132
|
-
const page = this._wrap(await this._owner.fetchNotifications({ indexMin: this._state.cursor }));
|
|
133
|
-
this._commit([...this._items, ...page]);
|
|
134
|
-
this._state.cursor += page.length;
|
|
135
|
-
this._state.hasMore = page.length >= this._pageSize;
|
|
136
|
-
return page;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/** Recharge depuis le début. */
|
|
140
|
-
async refresh(): Promise<Notification[]> { this._state.cursor = 0; this._state.hasMore = true; return this.list(); }
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Badge : total des NON-VUS via GET_NOTIFICATIONS_COUNT (refreshTimestamp = maintenant ->
|
|
144
|
-
* liste vide + countNotif). Met à jour unseenTotal et le retourne.
|
|
145
|
-
*/
|
|
146
|
-
async count(): Promise<number> {
|
|
147
|
-
this._state.unseenTotal = await this._owner.fetchNotificationsCount();
|
|
148
|
-
return this._state.unseenTotal;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* PUR : convertit des `NotificationItemData[]` plats (ex. cache React Query après
|
|
153
|
-
* hydratation SSR) en `Notification[]` liées à l'utilisateur, SANS modifier l'état du
|
|
154
|
-
* manager. À utiliser dans un `select` React Query (cache plat -> instances vivantes).
|
|
155
|
-
*/
|
|
156
|
-
toItems(data: NotificationItemData[]): Notification[] {
|
|
157
|
-
return this._wrap(data);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
async markAllRead(): Promise<void> { await this._bulk("read"); }
|
|
161
|
-
async markAllSeen(): Promise<void> { await this._bulk("seen"); }
|
|
162
|
-
|
|
163
|
-
private async _bulk(action: "seen" | "read"): Promise<void> {
|
|
164
|
-
const snap = this._items.map((n) => ({ n, u: n.isUnread, s: n.isUnseen }));
|
|
165
|
-
batch(() => { for (const { n } of snap) { if (action === "read") n._setReadLocal(); else n._setSeenLocal(); } });
|
|
166
|
-
if (action === "seen") this._state.unseenTotal = 0;
|
|
167
|
-
this._recount();
|
|
168
|
-
try {
|
|
169
|
-
await this._owner.markAllNotifications(action);
|
|
170
|
-
} catch (err) {
|
|
171
|
-
batch(() => { for (const { n, u, s } of snap) n._restoreLocal(u, s); });
|
|
172
|
-
this._recount();
|
|
173
|
-
throw err;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/** Supprime toutes les notifications de l'utilisateur + vide l'état local. */
|
|
178
|
-
async clear(): Promise<void> {
|
|
179
|
-
await this._owner.removeAllNotifications();
|
|
180
|
-
this._commit([]);
|
|
181
|
-
this._state.cursor = 0;
|
|
182
|
-
this._state.hasMore = false;
|
|
183
|
-
this._state.unseenTotal = 0;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// sérialisation (donnée brute ; le backref owner + l'état réactif sont re-construits au restore)
|
|
187
|
-
toJSON(): NotificationItemData[] { return this._items.map((n) => n.toJSON()); }
|
|
188
|
-
restore(rawItems: NotificationItemData[]): this {
|
|
189
|
-
this._commit(this._wrap(rawItems));
|
|
190
|
-
this._state.cursor = rawItems.length;
|
|
191
|
-
return this;
|
|
192
|
-
}
|
|
193
|
-
static restore(rawItems: NotificationItemData[], owner: User): Notifications {
|
|
194
|
-
return new Notifications(owner).restore(rawItems);
|
|
195
|
-
}
|
|
196
|
-
}
|