Example

1import { Button, HStack, Image, LiveActivity, LiveActivityState, Navigation, NavigationStack, Script, Text, useMemo, useState, VStack } from "scripting"
2
3function Example() {
4  const dismiss = Navigation.useDismiss()
5
6  const [state, setState] = useState<LiveActivityState>()
7  const activity = useMemo(() => {
8    const activity = new LiveActivity((attributes: {
9      mins: number
10    }) => {
11
12      return {
13        content: <HStack>
14          <Image systemName={"clock"} />
15          <Text>{attributes.mins}minutes left until next drink</Text>
16        </HStack>,
17        compactLeading: <HStack>
18          <Image systemName={"clock"} />
19          <Text>{attributes.mins}mins</Text>
20        </HStack>,
21        compactTrailing: <Image systemName={"waterbottle"} foregroundStyle={"systemBlue"} />,
22        minimal: <Image systemName={"clock"} />,
23        expanded: {
24          center: <HStack>
25            <Image systemName={"clock"} />
26            <Text>{attributes.mins}minutes left until next drink</Text>
27          </HStack>,
28        }
29      }
30    })
31
32    activity.addUpdateListener(setState)
33
34    return activity
35  }, [])
36
37  return <NavigationStack>
38    <VStack
39      navigationTitle={"LiveActivity Example"}
40      navigationBarTitleDisplayMode={"inline"}
41      toolbar={{
42        cancellationAction: <Button
43          title={"Done"}
44          action={dismiss}
45        />
46      }}
47    >
48      <Text>Activity State: {state ?? '-'}</Text>
49      <Button
50        title={"Start Live Activity"}
51        disabled={state != null}
52        action={() => {
53          let count = 5
54          activity.start({ mins: count })
55
56          function startTimer() {
57            setTimeout(() => {
58              count -= 1
59              if (count === 0) {
60                activity.end({ mins: 0 })
61              } else {
62                activity.update({ mins: count })
63                startTimer()
64              }
65            }, 60000)
66          }
67
68          startTimer()
69        }}
70      />
71    </VStack>
72  </NavigationStack>
73}
74
75async function run() {
76  await Navigation.present({
77    element: <Example />
78  })
79
80  Script.exit()
81}
82
83run()