[{"data":1,"prerenderedAt":2024},["ShallowReactive",2],{"/docs/scripts/free-phone/exports/client-exports":3,"/docs/scripts/free-phone/exports/client-exports-surround":2013,"/docs/scripts/free-phone/exports/client-exports-implemented-suggestions":2023},{"id":4,"title":5,"body":6,"description":2004,"extension":2005,"head":2006,"implementedSuggestions":2006,"meta":2007,"navigation":567,"path":2008,"schemaOrg":2006,"seo":2009,"sitemap":2010,"stem":2011,"__hash__":2012},"docs/1.docs/scripts/4.free-phone/3.exports/1.client-exports.md","Client Exports",{"type":7,"value":8,"toc":1992},"minimark",[9,17,20,33,37,44,51,225,650,656,662,690,924,927,933,960,1037,1040,1046,1080,1235,1238,1244,1269,1344,1350,1383,1548,1551,1557,1659,1809,1817,1823,1836,1985,1988],[10,11,12],"p",{},[13,14,16],"a",{"href":15},"/docs/scripts/free-phone/exports","All exports",[10,18,19],{},"This page documents the supported public integration calls. Client exports must run in a client\nscript and server exports must run in a server script. Internal NUI callbacks and net events are not\npublic APIs.",[21,22,25],"callout",{"color":23,"icon":24},"success","i-lucide-shield-check",[10,26,27,28,32],{},"Keep the resource folder named ",[29,30,31],"code",{},"sky_phone",". Validate every returned success value and keep money,\npermissions, ownership, and other authoritative changes on the server.",[34,35,5],"h2",{"id":36},"client-exports",[10,38,39,40,43],{},"Client exports register and control custom apps owned by the calling resource. Free Phone binds the\nowner automatically through ",[29,41,42],{},"GetInvokingResource()",".",[45,46,48],"h3",{"id":47},"addcustomappdefinition",[29,49,50],{},"AddCustomApp(definition)",[52,53,54,62,207],"ul",{},[55,56,57,61],"li",{},[58,59,60],"strong",{},"Purpose",": Registers a custom app owned by the calling resource.",[55,63,64,67,68],{},[58,65,66],{},"Arguments",":\n",[52,69,70],{},[55,71,72,75,76,79,80],{},[29,73,74],{},"definition"," (",[29,77,78],{},"table","): Complete app definition.\n",[52,81,82,91,100,112,121,130,155,165,174,190,199],{},[55,83,84,75,87,90],{},[29,85,86],{},"id",[29,88,89],{},"string","): Stable lowercase app ID. Required.",[55,92,93,75,96,99],{},[29,94,95],{},"name",[29,97,98],{},"string | table","): Display name or localized names. Required.",[55,101,102,75,105,107,108,111],{},[29,103,104],{},"ui",[29,106,89],{},"): Local ",[29,109,110],{},"web/..."," entry file or allowed remote UI. Required.",[55,113,114,75,117,120],{},[29,115,116],{},"description",[29,118,119],{},"string | table?","): Optional description.",[55,122,123,75,126,129],{},[29,124,125],{},"developer",[29,127,128],{},"string?","): Developer or resource label.",[55,131,132,75,135,137,138,141,142,141,145,141,148,151,152,43],{},[29,133,134],{},"category",[29,136,128],{},"): ",[29,139,140],{},"games",", ",[29,143,144],{},"productivity",[29,146,147],{},"shopping",[29,149,150],{},"social",", or ",[29,153,154],{},"utilities",[55,156,157,75,160,107,162,164],{},[29,158,159],{},"icon",[29,161,128],{},[29,163,110],{}," icon or allowed remote icon.",[55,166,167,75,170,173],{},[29,168,169],{},"permissions",[29,171,172],{},"table?","): Requested app permissions.",[55,175,176,75,179,137,181,141,184,151,187,43],{},[29,177,178],{},"orientation",[29,180,128],{},[29,182,183],{},"portrait",[29,185,186],{},"landscape",[29,188,189],{},"any",[55,191,192,75,195,198],{},[29,193,194],{},"defaultInstalled",[29,196,197],{},"boolean?","): Installs the app by default.",[55,200,201,75,204,206],{},[29,202,203],{},"removable",[29,205,197],{},"): Allows the player to uninstall the app.",[55,208,209,212,213,216,217,220,221,224],{},[58,210,211],{},"Returns",": ",[29,214,215],{},"boolean, string?"," — ",[29,218,219],{},"true"," on success, otherwise ",[29,222,223],{},"false"," and a stable error code.",[226,227,233],"pre",{"className":228,"code":229,"filename":230,"language":231,"meta":232,"style":232},"language-lua shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","local app = {\n    id = \"dispatch-board\",\n    name = {\n        en = \"Dispatch Board\",\n        de = \"Leitstelle\",\n    },\n    description = {\n        en = \"Live dispatch information\",\n        de = \"Live-Informationen der Leitstelle\",\n    },\n    developer = \"my_dispatch\",\n    category = \"productivity\",\n    ui = \"web/index.html\",\n    icon = \"web/icon.webp\",\n    orientation = \"portrait\",\n    defaultInstalled = true,\n    removable = true,\n    permissions = {\n        \"app.close\",\n        \"device.storage\",\n        \"notifications\",\n        \"theme.read\",\n        \"locale.read\",\n    },\n}\n\nlocal registered, error_code = exports[\"sky_phone\"]:AddCustomApp(app)\n\nif not registered then\n    print((\"[my_dispatch] Registration failed: %s\"):format(error_code))\nend\n","client.lua","lua","",[29,234,235,254,275,285,302,319,325,335,351,367,372,389,405,422,439,455,468,480,490,503,515,527,539,551,556,562,569,598,603,619,644],{"__ignoreMap":232},[236,237,240,244,248,251],"span",{"class":238,"line":239},"line",1,[236,241,243],{"class":242},"sMK4o","local",[236,245,247],{"class":246},"sTEyZ"," app ",[236,249,250],{"class":242},"=",[236,252,253],{"class":246}," {\n",[236,255,257,260,262,265,269,272],{"class":238,"line":256},2,[236,258,259],{"class":246},"    id ",[236,261,250],{"class":242},[236,263,264],{"class":242}," \"",[236,266,268],{"class":267},"sfazB","dispatch-board",[236,270,271],{"class":242},"\"",[236,273,274],{"class":246},",\n",[236,276,278,281,283],{"class":238,"line":277},3,[236,279,280],{"class":246},"    name ",[236,282,250],{"class":242},[236,284,253],{"class":246},[236,286,288,291,293,295,298,300],{"class":238,"line":287},4,[236,289,290],{"class":246},"        en ",[236,292,250],{"class":242},[236,294,264],{"class":242},[236,296,297],{"class":267},"Dispatch Board",[236,299,271],{"class":242},[236,301,274],{"class":246},[236,303,305,308,310,312,315,317],{"class":238,"line":304},5,[236,306,307],{"class":246},"        de ",[236,309,250],{"class":242},[236,311,264],{"class":242},[236,313,314],{"class":267},"Leitstelle",[236,316,271],{"class":242},[236,318,274],{"class":246},[236,320,322],{"class":238,"line":321},6,[236,323,324],{"class":246},"    },\n",[236,326,328,331,333],{"class":238,"line":327},7,[236,329,330],{"class":246},"    description ",[236,332,250],{"class":242},[236,334,253],{"class":246},[236,336,338,340,342,344,347,349],{"class":238,"line":337},8,[236,339,290],{"class":246},[236,341,250],{"class":242},[236,343,264],{"class":242},[236,345,346],{"class":267},"Live dispatch information",[236,348,271],{"class":242},[236,350,274],{"class":246},[236,352,354,356,358,360,363,365],{"class":238,"line":353},9,[236,355,307],{"class":246},[236,357,250],{"class":242},[236,359,264],{"class":242},[236,361,362],{"class":267},"Live-Informationen der Leitstelle",[236,364,271],{"class":242},[236,366,274],{"class":246},[236,368,370],{"class":238,"line":369},10,[236,371,324],{"class":246},[236,373,375,378,380,382,385,387],{"class":238,"line":374},11,[236,376,377],{"class":246},"    developer ",[236,379,250],{"class":242},[236,381,264],{"class":242},[236,383,384],{"class":267},"my_dispatch",[236,386,271],{"class":242},[236,388,274],{"class":246},[236,390,392,395,397,399,401,403],{"class":238,"line":391},12,[236,393,394],{"class":246},"    category ",[236,396,250],{"class":242},[236,398,264],{"class":242},[236,400,144],{"class":267},[236,402,271],{"class":242},[236,404,274],{"class":246},[236,406,408,411,413,415,418,420],{"class":238,"line":407},13,[236,409,410],{"class":246},"    ui ",[236,412,250],{"class":242},[236,414,264],{"class":242},[236,416,417],{"class":267},"web/index.html",[236,419,271],{"class":242},[236,421,274],{"class":246},[236,423,425,428,430,432,435,437],{"class":238,"line":424},14,[236,426,427],{"class":246},"    icon ",[236,429,250],{"class":242},[236,431,264],{"class":242},[236,433,434],{"class":267},"web/icon.webp",[236,436,271],{"class":242},[236,438,274],{"class":246},[236,440,442,445,447,449,451,453],{"class":238,"line":441},15,[236,443,444],{"class":246},"    orientation ",[236,446,250],{"class":242},[236,448,264],{"class":242},[236,450,183],{"class":267},[236,452,271],{"class":242},[236,454,274],{"class":246},[236,456,458,461,463,466],{"class":238,"line":457},16,[236,459,460],{"class":246},"    defaultInstalled ",[236,462,250],{"class":242},[236,464,465],{"class":242}," true",[236,467,274],{"class":246},[236,469,471,474,476,478],{"class":238,"line":470},17,[236,472,473],{"class":246},"    removable ",[236,475,250],{"class":242},[236,477,465],{"class":242},[236,479,274],{"class":246},[236,481,483,486,488],{"class":238,"line":482},18,[236,484,485],{"class":246},"    permissions ",[236,487,250],{"class":242},[236,489,253],{"class":246},[236,491,493,496,499,501],{"class":238,"line":492},19,[236,494,495],{"class":242},"        \"",[236,497,498],{"class":267},"app.close",[236,500,271],{"class":242},[236,502,274],{"class":246},[236,504,506,508,511,513],{"class":238,"line":505},20,[236,507,495],{"class":242},[236,509,510],{"class":267},"device.storage",[236,512,271],{"class":242},[236,514,274],{"class":246},[236,516,518,520,523,525],{"class":238,"line":517},21,[236,519,495],{"class":242},[236,521,522],{"class":267},"notifications",[236,524,271],{"class":242},[236,526,274],{"class":246},[236,528,530,532,535,537],{"class":238,"line":529},22,[236,531,495],{"class":242},[236,533,534],{"class":267},"theme.read",[236,536,271],{"class":242},[236,538,274],{"class":246},[236,540,542,544,547,549],{"class":238,"line":541},23,[236,543,495],{"class":242},[236,545,546],{"class":267},"locale.read",[236,548,271],{"class":242},[236,550,274],{"class":246},[236,552,554],{"class":238,"line":553},24,[236,555,324],{"class":246},[236,557,559],{"class":238,"line":558},25,[236,560,561],{"class":246},"}\n",[236,563,565],{"class":238,"line":564},26,[236,566,568],{"emptyLinePlaceholder":567},true,"\n",[236,570,572,574,577,579,582,584,586,588,591,595],{"class":238,"line":571},27,[236,573,243],{"class":242},[236,575,576],{"class":246}," registered, error_code ",[236,578,250],{"class":242},[236,580,581],{"class":246}," exports[",[236,583,271],{"class":242},[236,585,31],{"class":267},[236,587,271],{"class":242},[236,589,590],{"class":246},"]:",[236,592,594],{"class":593},"s2Zo4","AddCustomApp",[236,596,597],{"class":246},"(app)\n",[236,599,601],{"class":238,"line":600},28,[236,602,568],{"emptyLinePlaceholder":567},[236,604,606,610,613,616],{"class":238,"line":605},29,[236,607,609],{"class":608},"s7zQu","if",[236,611,612],{"class":242}," not",[236,614,615],{"class":246}," registered ",[236,617,618],{"class":608},"then\n",[236,620,622,625,628,630,633,635,638,641],{"class":238,"line":621},30,[236,623,624],{"class":593},"    print",[236,626,627],{"class":246},"((",[236,629,271],{"class":242},[236,631,632],{"class":267},"[my_dispatch] Registration failed: %s",[236,634,271],{"class":242},[236,636,637],{"class":246},"):",[236,639,640],{"class":593},"format",[236,642,643],{"class":246},"(error_code))\n",[236,645,647],{"class":238,"line":646},31,[236,648,649],{"class":608},"end\n",[10,651,652,653,43],{},"Local UI and icon files belong to the calling resource and must be included in that resource's\n",[29,654,655],{},"fxmanifest.lua",[45,657,659],{"id":658},"updatecustomappdefinition",[29,660,661],{},"UpdateCustomApp(definition)",[52,663,664,669,684],{},[55,665,666,668],{},[58,667,60],{},": Replaces an owned custom app definition.",[55,670,671,67,673],{},[58,672,66],{},[52,674,675],{},[55,676,677,75,679,681,682,43],{},[29,678,74],{},[29,680,78],{},"): The complete definition, including the existing ",[29,683,86],{},[55,685,686,212,688,43],{},[58,687,211],{},[29,689,215],{},[226,691,693],{"className":228,"code":692,"filename":230,"language":231,"meta":232,"style":232},"local updated, error_code = exports[\"sky_phone\"]:UpdateCustomApp({\n    id = \"dispatch-board\",\n    name = \"Dispatch Board\",\n    description = \"Live incidents and unit status\",\n    developer = \"my_dispatch\",\n    category = \"productivity\",\n    ui = \"web/index.html\",\n    icon = \"web/icon.webp\",\n    defaultInstalled = true,\n    removable = true,\n    permissions = {\n        \"app.close\",\n        \"device.storage\",\n        \"notifications\",\n    },\n})\n\nif not updated then\n    print((\"[my_dispatch] Update failed: %s\"):format(error_code))\nend\n",[29,694,695,720,734,748,763,777,791,805,819,829,839,847,857,867,877,881,886,890,901,920],{"__ignoreMap":232},[236,696,697,699,702,704,706,708,710,712,714,717],{"class":238,"line":239},[236,698,243],{"class":242},[236,700,701],{"class":246}," updated, error_code ",[236,703,250],{"class":242},[236,705,581],{"class":246},[236,707,271],{"class":242},[236,709,31],{"class":267},[236,711,271],{"class":242},[236,713,590],{"class":246},[236,715,716],{"class":593},"UpdateCustomApp",[236,718,719],{"class":246},"({\n",[236,721,722,724,726,728,730,732],{"class":238,"line":256},[236,723,259],{"class":246},[236,725,250],{"class":242},[236,727,264],{"class":242},[236,729,268],{"class":267},[236,731,271],{"class":242},[236,733,274],{"class":246},[236,735,736,738,740,742,744,746],{"class":238,"line":277},[236,737,280],{"class":246},[236,739,250],{"class":242},[236,741,264],{"class":242},[236,743,297],{"class":267},[236,745,271],{"class":242},[236,747,274],{"class":246},[236,749,750,752,754,756,759,761],{"class":238,"line":287},[236,751,330],{"class":246},[236,753,250],{"class":242},[236,755,264],{"class":242},[236,757,758],{"class":267},"Live incidents and unit status",[236,760,271],{"class":242},[236,762,274],{"class":246},[236,764,765,767,769,771,773,775],{"class":238,"line":304},[236,766,377],{"class":246},[236,768,250],{"class":242},[236,770,264],{"class":242},[236,772,384],{"class":267},[236,774,271],{"class":242},[236,776,274],{"class":246},[236,778,779,781,783,785,787,789],{"class":238,"line":321},[236,780,394],{"class":246},[236,782,250],{"class":242},[236,784,264],{"class":242},[236,786,144],{"class":267},[236,788,271],{"class":242},[236,790,274],{"class":246},[236,792,793,795,797,799,801,803],{"class":238,"line":327},[236,794,410],{"class":246},[236,796,250],{"class":242},[236,798,264],{"class":242},[236,800,417],{"class":267},[236,802,271],{"class":242},[236,804,274],{"class":246},[236,806,807,809,811,813,815,817],{"class":238,"line":337},[236,808,427],{"class":246},[236,810,250],{"class":242},[236,812,264],{"class":242},[236,814,434],{"class":267},[236,816,271],{"class":242},[236,818,274],{"class":246},[236,820,821,823,825,827],{"class":238,"line":353},[236,822,460],{"class":246},[236,824,250],{"class":242},[236,826,465],{"class":242},[236,828,274],{"class":246},[236,830,831,833,835,837],{"class":238,"line":369},[236,832,473],{"class":246},[236,834,250],{"class":242},[236,836,465],{"class":242},[236,838,274],{"class":246},[236,840,841,843,845],{"class":238,"line":374},[236,842,485],{"class":246},[236,844,250],{"class":242},[236,846,253],{"class":246},[236,848,849,851,853,855],{"class":238,"line":391},[236,850,495],{"class":242},[236,852,498],{"class":267},[236,854,271],{"class":242},[236,856,274],{"class":246},[236,858,859,861,863,865],{"class":238,"line":407},[236,860,495],{"class":242},[236,862,510],{"class":267},[236,864,271],{"class":242},[236,866,274],{"class":246},[236,868,869,871,873,875],{"class":238,"line":424},[236,870,495],{"class":242},[236,872,522],{"class":267},[236,874,271],{"class":242},[236,876,274],{"class":246},[236,878,879],{"class":238,"line":441},[236,880,324],{"class":246},[236,882,883],{"class":238,"line":457},[236,884,885],{"class":246},"})\n",[236,887,888],{"class":238,"line":470},[236,889,568],{"emptyLinePlaceholder":567},[236,891,892,894,896,899],{"class":238,"line":482},[236,893,609],{"class":608},[236,895,612],{"class":242},[236,897,898],{"class":246}," updated ",[236,900,618],{"class":608},[236,902,903,905,907,909,912,914,916,918],{"class":238,"line":492},[236,904,624],{"class":593},[236,906,627],{"class":246},[236,908,271],{"class":242},[236,910,911],{"class":267},"[my_dispatch] Update failed: %s",[236,913,271],{"class":242},[236,915,637],{"class":246},[236,917,640],{"class":593},[236,919,643],{"class":246},[236,921,922],{"class":238,"line":505},[236,923,649],{"class":608},[10,925,926],{},"This export does not accept a partial patch. Omitted fields are removed from the stored definition.",[45,928,930],{"id":929},"removecustomappappid",[29,931,932],{},"RemoveCustomApp(appId)",[52,934,935,940,954],{},[55,936,937,939],{},[58,938,60],{},": Removes an app owned by the calling resource.",[55,941,942,67,944],{},[58,943,66],{},[52,945,946],{},[55,947,948,75,951,953],{},[29,949,950],{},"appId",[29,952,89],{},"): App ID used during registration.",[55,955,956,212,958,43],{},[58,957,211],{},[29,959,215],{},[226,961,963],{"className":228,"code":962,"filename":230,"language":231,"meta":232,"style":232},"local removed, error_code = exports[\"sky_phone\"]:RemoveCustomApp(\"dispatch-board\")\n\nif not removed then\n    print((\"[my_dispatch] Removal failed: %s\"):format(error_code))\nend\n",[29,964,965,999,1003,1014,1033],{"__ignoreMap":232},[236,966,967,969,972,974,976,978,980,982,984,987,990,992,994,996],{"class":238,"line":239},[236,968,243],{"class":242},[236,970,971],{"class":246}," removed, error_code ",[236,973,250],{"class":242},[236,975,581],{"class":246},[236,977,271],{"class":242},[236,979,31],{"class":267},[236,981,271],{"class":242},[236,983,590],{"class":246},[236,985,986],{"class":593},"RemoveCustomApp",[236,988,989],{"class":246},"(",[236,991,271],{"class":242},[236,993,268],{"class":267},[236,995,271],{"class":242},[236,997,998],{"class":246},")\n",[236,1000,1001],{"class":238,"line":256},[236,1002,568],{"emptyLinePlaceholder":567},[236,1004,1005,1007,1009,1012],{"class":238,"line":277},[236,1006,609],{"class":608},[236,1008,612],{"class":242},[236,1010,1011],{"class":246}," removed ",[236,1013,618],{"class":608},[236,1015,1016,1018,1020,1022,1025,1027,1029,1031],{"class":238,"line":287},[236,1017,624],{"class":593},[236,1019,627],{"class":246},[236,1021,271],{"class":242},[236,1023,1024],{"class":267},"[my_dispatch] Removal failed: %s",[236,1026,271],{"class":242},[236,1028,637],{"class":246},[236,1030,640],{"class":593},[236,1032,643],{"class":246},[236,1034,1035],{"class":238,"line":304},[236,1036,649],{"class":608},[10,1038,1039],{},"Owned apps are also removed automatically when their resource stops.",[45,1041,1043],{"id":1042},"opencustomappappid-data",[29,1044,1045],{},"OpenCustomApp(appId, data?)",[52,1047,1048,1053,1074],{},[55,1049,1050,1052],{},[58,1051,60],{},": Opens an owned app in an already visible phone.",[55,1054,1055,67,1057],{},[58,1056,66],{},[52,1058,1059,1066],{},[55,1060,1061,75,1063,1065],{},[29,1062,950],{},[29,1064,89],{},"): Registered app ID.",[55,1067,1068,75,1071,1073],{},[29,1069,1070],{},"data",[29,1072,172],{},"): JSON-compatible opening payload delivered to the iframe.",[55,1075,1076,212,1078,43],{},[58,1077,211],{},[29,1079,215],{},[226,1081,1083],{"className":228,"code":1082,"filename":230,"language":231,"meta":232,"style":232},"RegisterCommand(\"dispatchphone\", function()\n    local opened, error_code = exports[\"sky_phone\"]:OpenCustomApp(\n        \"dispatch-board\",\n        {\n            incidentId = 184,\n            source = \"command\",\n        }\n    )\n\n    if not opened then\n        print((\"[my_dispatch] Could not open app: %s\"):format(error_code))\n    end\nend)\n",[29,1084,1085,1107,1133,1143,1148,1161,1177,1182,1187,1191,1203,1223,1228],{"__ignoreMap":232},[236,1086,1087,1090,1092,1094,1097,1099,1101,1104],{"class":238,"line":239},[236,1088,1089],{"class":593},"RegisterCommand",[236,1091,989],{"class":246},[236,1093,271],{"class":242},[236,1095,1096],{"class":267},"dispatchphone",[236,1098,271],{"class":242},[236,1100,141],{"class":246},[236,1102,1103],{"class":608},"function",[236,1105,1106],{"class":242},"()\n",[236,1108,1109,1112,1115,1117,1119,1121,1123,1125,1127,1130],{"class":238,"line":256},[236,1110,1111],{"class":242},"    local",[236,1113,1114],{"class":246}," opened, error_code ",[236,1116,250],{"class":242},[236,1118,581],{"class":246},[236,1120,271],{"class":242},[236,1122,31],{"class":267},[236,1124,271],{"class":242},[236,1126,590],{"class":246},[236,1128,1129],{"class":593},"OpenCustomApp",[236,1131,1132],{"class":246},"(\n",[236,1134,1135,1137,1139,1141],{"class":238,"line":277},[236,1136,495],{"class":242},[236,1138,268],{"class":267},[236,1140,271],{"class":242},[236,1142,274],{"class":246},[236,1144,1145],{"class":238,"line":287},[236,1146,1147],{"class":246},"        {\n",[236,1149,1150,1153,1155,1159],{"class":238,"line":304},[236,1151,1152],{"class":246},"            incidentId ",[236,1154,250],{"class":242},[236,1156,1158],{"class":1157},"sbssI"," 184",[236,1160,274],{"class":246},[236,1162,1163,1166,1168,1170,1173,1175],{"class":238,"line":321},[236,1164,1165],{"class":246},"            source ",[236,1167,250],{"class":242},[236,1169,264],{"class":242},[236,1171,1172],{"class":267},"command",[236,1174,271],{"class":242},[236,1176,274],{"class":246},[236,1178,1179],{"class":238,"line":327},[236,1180,1181],{"class":246},"        }\n",[236,1183,1184],{"class":238,"line":337},[236,1185,1186],{"class":246},"    )\n",[236,1188,1189],{"class":238,"line":353},[236,1190,568],{"emptyLinePlaceholder":567},[236,1192,1193,1196,1198,1201],{"class":238,"line":369},[236,1194,1195],{"class":608},"    if",[236,1197,612],{"class":242},[236,1199,1200],{"class":246}," opened ",[236,1202,618],{"class":608},[236,1204,1205,1208,1210,1212,1215,1217,1219,1221],{"class":238,"line":374},[236,1206,1207],{"class":593},"        print",[236,1209,627],{"class":246},[236,1211,271],{"class":242},[236,1213,1214],{"class":267},"[my_dispatch] Could not open app: %s",[236,1216,271],{"class":242},[236,1218,637],{"class":246},[236,1220,640],{"class":593},[236,1222,643],{"class":246},[236,1224,1225],{"class":238,"line":391},[236,1226,1227],{"class":608},"    end\n",[236,1229,1230,1233],{"class":238,"line":407},[236,1231,1232],{"class":608},"end",[236,1234,998],{"class":246},[10,1236,1237],{},"This export navigates inside an open phone. It does not bypass the phone item, lock screen, or device\nsession.",[45,1239,1241],{"id":1240},"closecustomappappid",[29,1242,1243],{},"CloseCustomApp(appId)",[52,1245,1246,1251,1263],{},[55,1247,1248,1250],{},[58,1249,60],{},": Closes the active owned custom app.",[55,1252,1253,67,1255],{},[58,1254,66],{},[52,1256,1257],{},[55,1258,1259,75,1261,1065],{},[29,1260,950],{},[29,1262,89],{},[55,1264,1265,212,1267,43],{},[58,1266,211],{},[29,1268,215],{},[226,1270,1272],{"className":228,"code":1271,"filename":230,"language":231,"meta":232,"style":232},"local closed, error_code = exports[\"sky_phone\"]:CloseCustomApp(\"dispatch-board\")\n\nif not closed then\n    print((\"[my_dispatch] Close failed: %s\"):format(error_code))\nend\n",[29,1273,1274,1306,1310,1321,1340],{"__ignoreMap":232},[236,1275,1276,1278,1281,1283,1285,1287,1289,1291,1293,1296,1298,1300,1302,1304],{"class":238,"line":239},[236,1277,243],{"class":242},[236,1279,1280],{"class":246}," closed, error_code ",[236,1282,250],{"class":242},[236,1284,581],{"class":246},[236,1286,271],{"class":242},[236,1288,31],{"class":267},[236,1290,271],{"class":242},[236,1292,590],{"class":246},[236,1294,1295],{"class":593},"CloseCustomApp",[236,1297,989],{"class":246},[236,1299,271],{"class":242},[236,1301,268],{"class":267},[236,1303,271],{"class":242},[236,1305,998],{"class":246},[236,1307,1308],{"class":238,"line":256},[236,1309,568],{"emptyLinePlaceholder":567},[236,1311,1312,1314,1316,1319],{"class":238,"line":277},[236,1313,609],{"class":608},[236,1315,612],{"class":242},[236,1317,1318],{"class":246}," closed ",[236,1320,618],{"class":608},[236,1322,1323,1325,1327,1329,1332,1334,1336,1338],{"class":238,"line":287},[236,1324,624],{"class":593},[236,1326,627],{"class":246},[236,1328,271],{"class":242},[236,1330,1331],{"class":267},"[my_dispatch] Close failed: %s",[236,1333,271],{"class":242},[236,1335,637],{"class":246},[236,1337,640],{"class":593},[236,1339,643],{"class":246},[236,1341,1342],{"class":238,"line":304},[236,1343,649],{"class":608},[45,1345,1347],{"id":1346},"sendcustomappmessageappid-payload",[29,1348,1349],{},"SendCustomAppMessage(appId, payload)",[52,1351,1352,1357,1377],{},[55,1353,1354,1356],{},[58,1355,60],{},": Sends JSON-compatible data to an active and ready owned app.",[55,1358,1359,67,1361],{},[58,1360,66],{},[52,1362,1363,1369],{},[55,1364,1365,75,1367,1065],{},[29,1366,950],{},[29,1368,89],{},[55,1370,1371,75,1374,1376],{},[29,1372,1373],{},"payload",[29,1375,189],{},"): JSON-compatible payload within the configured message-size limit.",[55,1378,1379,212,1381,43],{},[58,1380,211],{},[29,1382,215],{},[226,1384,1386],{"className":228,"code":1385,"filename":230,"language":231,"meta":232,"style":232},"local sent, error_code = exports[\"sky_phone\"]:SendCustomAppMessage(\n    \"dispatch-board\",\n    {\n        type = \"incident:update\",\n        incident = {\n            id = 184,\n            status = \"responding\",\n            assignedUnit = \"ADAM-12\",\n        },\n    }\n)\n\nif not sent then\n    print((\"[my_dispatch] Message failed: %s\"):format(error_code))\nend\n",[29,1387,1388,1412,1423,1428,1444,1453,1464,1480,1496,1501,1506,1510,1514,1525,1544],{"__ignoreMap":232},[236,1389,1390,1392,1395,1397,1399,1401,1403,1405,1407,1410],{"class":238,"line":239},[236,1391,243],{"class":242},[236,1393,1394],{"class":246}," sent, error_code ",[236,1396,250],{"class":242},[236,1398,581],{"class":246},[236,1400,271],{"class":242},[236,1402,31],{"class":267},[236,1404,271],{"class":242},[236,1406,590],{"class":246},[236,1408,1409],{"class":593},"SendCustomAppMessage",[236,1411,1132],{"class":246},[236,1413,1414,1417,1419,1421],{"class":238,"line":256},[236,1415,1416],{"class":242},"    \"",[236,1418,268],{"class":267},[236,1420,271],{"class":242},[236,1422,274],{"class":246},[236,1424,1425],{"class":238,"line":277},[236,1426,1427],{"class":246},"    {\n",[236,1429,1430,1433,1435,1437,1440,1442],{"class":238,"line":287},[236,1431,1432],{"class":246},"        type ",[236,1434,250],{"class":242},[236,1436,264],{"class":242},[236,1438,1439],{"class":267},"incident:update",[236,1441,271],{"class":242},[236,1443,274],{"class":246},[236,1445,1446,1449,1451],{"class":238,"line":304},[236,1447,1448],{"class":246},"        incident ",[236,1450,250],{"class":242},[236,1452,253],{"class":246},[236,1454,1455,1458,1460,1462],{"class":238,"line":321},[236,1456,1457],{"class":246},"            id ",[236,1459,250],{"class":242},[236,1461,1158],{"class":1157},[236,1463,274],{"class":246},[236,1465,1466,1469,1471,1473,1476,1478],{"class":238,"line":327},[236,1467,1468],{"class":246},"            status ",[236,1470,250],{"class":242},[236,1472,264],{"class":242},[236,1474,1475],{"class":267},"responding",[236,1477,271],{"class":242},[236,1479,274],{"class":246},[236,1481,1482,1485,1487,1489,1492,1494],{"class":238,"line":337},[236,1483,1484],{"class":246},"            assignedUnit ",[236,1486,250],{"class":242},[236,1488,264],{"class":242},[236,1490,1491],{"class":267},"ADAM-12",[236,1493,271],{"class":242},[236,1495,274],{"class":246},[236,1497,1498],{"class":238,"line":353},[236,1499,1500],{"class":246},"        },\n",[236,1502,1503],{"class":238,"line":369},[236,1504,1505],{"class":246},"    }\n",[236,1507,1508],{"class":238,"line":374},[236,1509,998],{"class":246},[236,1511,1512],{"class":238,"line":391},[236,1513,568],{"emptyLinePlaceholder":567},[236,1515,1516,1518,1520,1523],{"class":238,"line":407},[236,1517,609],{"class":608},[236,1519,612],{"class":242},[236,1521,1522],{"class":246}," sent ",[236,1524,618],{"class":608},[236,1526,1527,1529,1531,1533,1536,1538,1540,1542],{"class":238,"line":424},[236,1528,624],{"class":593},[236,1530,627],{"class":246},[236,1532,271],{"class":242},[236,1534,1535],{"class":267},"[my_dispatch] Message failed: %s",[236,1537,271],{"class":242},[236,1539,637],{"class":246},[236,1541,640],{"class":593},[236,1543,643],{"class":246},[236,1545,1546],{"class":238,"line":441},[236,1547,649],{"class":608},[10,1549,1550],{},"Messages sent while the app is opening are queued up to the configured queue limit and delivered\nafter the iframe reports bridge readiness.",[45,1552,1554],{"id":1553},"sendcustomappnotificationappid-notification",[29,1555,1556],{},"SendCustomAppNotification(appId, notification)",[52,1558,1559,1564,1653],{},[55,1560,1561,1563],{},[58,1562,60],{},": Creates a validated phone notification for an owned app.",[55,1565,1566,67,1568],{},[58,1567,66],{},[52,1569,1570,1576],{},[55,1571,1572,75,1574,1065],{},[29,1573,950],{},[29,1575,89],{},[55,1577,1578,75,1581,1583,1584],{},[29,1579,1580],{},"notification",[29,1582,78],{},"): Notification definition.\n",[52,1585,1586,1594,1602,1610,1626,1637,1645],{},[55,1587,1588,75,1591,1593],{},[29,1589,1590],{},"title",[29,1592,128],{},"): Defaults to the app name.",[55,1595,1596,75,1599,1601],{},[29,1597,1598],{},"text",[29,1600,89],{},"): Notification body. Required.",[55,1603,1604,75,1607,1609],{},[29,1605,1606],{},"subtitle",[29,1608,128],{},"): Optional secondary text.",[55,1611,1612,75,1615,137,1617,141,1620,151,1623,43],{},[29,1613,1614],{},"sound",[29,1616,128],{},[29,1618,1619],{},"chime",[29,1621,1622],{},"signal",[29,1624,1625],{},"soft",[55,1627,1628,75,1631,1633,1634,43],{},[29,1629,1630],{},"critical",[29,1632,197],{},"): Requires ",[29,1635,1636],{},"notifications.critical",[55,1638,1639,75,1642,1644],{},[29,1640,1641],{},"persistent",[29,1643,197],{},"): Keeps the notification visible until handled.",[55,1646,1647,75,1650,1652],{},[29,1648,1649],{},"route",[29,1651,128],{},"): Must resolve to the app's own route.",[55,1654,1655,212,1657,43],{},[58,1656,211],{},[29,1658,215],{},[226,1660,1662],{"className":228,"code":1661,"filename":230,"language":231,"meta":232,"style":232},"local sent, error_code = exports[\"sky_phone\"]:SendCustomAppNotification(\n    \"dispatch-board\",\n    {\n        title = \"New dispatch\",\n        subtitle = \"Incident #184\",\n        text = \"Priority call at Mission Row\",\n        sound = \"signal\",\n    }\n)\n\nif not sent then\n    print((\"[my_dispatch] Notification failed: %s\"):format(error_code))\nend\n",[29,1663,1664,1687,1697,1701,1717,1733,1749,1764,1768,1772,1776,1786,1805],{"__ignoreMap":232},[236,1665,1666,1668,1670,1672,1674,1676,1678,1680,1682,1685],{"class":238,"line":239},[236,1667,243],{"class":242},[236,1669,1394],{"class":246},[236,1671,250],{"class":242},[236,1673,581],{"class":246},[236,1675,271],{"class":242},[236,1677,31],{"class":267},[236,1679,271],{"class":242},[236,1681,590],{"class":246},[236,1683,1684],{"class":593},"SendCustomAppNotification",[236,1686,1132],{"class":246},[236,1688,1689,1691,1693,1695],{"class":238,"line":256},[236,1690,1416],{"class":242},[236,1692,268],{"class":267},[236,1694,271],{"class":242},[236,1696,274],{"class":246},[236,1698,1699],{"class":238,"line":277},[236,1700,1427],{"class":246},[236,1702,1703,1706,1708,1710,1713,1715],{"class":238,"line":287},[236,1704,1705],{"class":246},"        title ",[236,1707,250],{"class":242},[236,1709,264],{"class":242},[236,1711,1712],{"class":267},"New dispatch",[236,1714,271],{"class":242},[236,1716,274],{"class":246},[236,1718,1719,1722,1724,1726,1729,1731],{"class":238,"line":304},[236,1720,1721],{"class":246},"        subtitle ",[236,1723,250],{"class":242},[236,1725,264],{"class":242},[236,1727,1728],{"class":267},"Incident #184",[236,1730,271],{"class":242},[236,1732,274],{"class":246},[236,1734,1735,1738,1740,1742,1745,1747],{"class":238,"line":321},[236,1736,1737],{"class":246},"        text ",[236,1739,250],{"class":242},[236,1741,264],{"class":242},[236,1743,1744],{"class":267},"Priority call at Mission Row",[236,1746,271],{"class":242},[236,1748,274],{"class":246},[236,1750,1751,1754,1756,1758,1760,1762],{"class":238,"line":327},[236,1752,1753],{"class":246},"        sound ",[236,1755,250],{"class":242},[236,1757,264],{"class":242},[236,1759,1622],{"class":267},[236,1761,271],{"class":242},[236,1763,274],{"class":246},[236,1765,1766],{"class":238,"line":337},[236,1767,1505],{"class":246},[236,1769,1770],{"class":238,"line":353},[236,1771,998],{"class":246},[236,1773,1774],{"class":238,"line":369},[236,1775,568],{"emptyLinePlaceholder":567},[236,1777,1778,1780,1782,1784],{"class":238,"line":374},[236,1779,609],{"class":608},[236,1781,612],{"class":242},[236,1783,1522],{"class":246},[236,1785,618],{"class":608},[236,1787,1788,1790,1792,1794,1797,1799,1801,1803],{"class":238,"line":391},[236,1789,624],{"class":593},[236,1791,627],{"class":246},[236,1793,271],{"class":242},[236,1795,1796],{"class":267},"[my_dispatch] Notification failed: %s",[236,1798,271],{"class":242},[236,1800,637],{"class":246},[236,1802,640],{"class":593},[236,1804,643],{"class":246},[236,1806,1807],{"class":238,"line":407},[236,1808,649],{"class":608},[10,1810,1811,1812,1814,1815,43],{},"The app definition must contain ",[29,1813,522],{},". Critical notifications additionally require\n",[29,1816,1636],{},[45,1818,1820],{"id":1819},"getcustomappcapabilities",[29,1821,1822],{},"GetCustomAppCapabilities()",[52,1824,1825,1830],{},[55,1826,1827,1829],{},[58,1828,60],{},": Reads the active custom-app ABI, protocol, bridge methods, context capabilities, and\nconfigured limits.",[55,1831,1832,212,1834,43],{},[58,1833,211],{},[29,1835,78],{},[226,1837,1839],{"className":228,"code":1838,"filename":230,"language":231,"meta":232,"style":232},"local capabilities = exports[\"sky_phone\"]:GetCustomAppCapabilities()\n\nprint(\"ABI\", capabilities.abiVersion)\nprint(\"Protocol\", capabilities.protocolVersion)\nprint(\"Enabled\", capabilities.enabled)\n\nfor _, method in ipairs(capabilities.bridgeMethods or {}) do\n    print(\"Bridge method\", method)\nend\n",[29,1840,1841,1865,1869,1892,1912,1932,1936,1965,1981],{"__ignoreMap":232},[236,1842,1843,1845,1848,1850,1852,1854,1856,1858,1860,1863],{"class":238,"line":239},[236,1844,243],{"class":242},[236,1846,1847],{"class":246}," capabilities ",[236,1849,250],{"class":242},[236,1851,581],{"class":246},[236,1853,271],{"class":242},[236,1855,31],{"class":267},[236,1857,271],{"class":242},[236,1859,590],{"class":246},[236,1861,1862],{"class":593},"GetCustomAppCapabilities",[236,1864,1106],{"class":246},[236,1866,1867],{"class":238,"line":256},[236,1868,568],{"emptyLinePlaceholder":567},[236,1870,1871,1874,1876,1878,1881,1883,1886,1890],{"class":238,"line":277},[236,1872,1873],{"class":593},"print",[236,1875,989],{"class":246},[236,1877,271],{"class":242},[236,1879,1880],{"class":267},"ABI",[236,1882,271],{"class":242},[236,1884,1885],{"class":246},", capabilities.",[236,1887,1889],{"class":1888},"sBMFI","abiVersion",[236,1891,998],{"class":246},[236,1893,1894,1896,1898,1900,1903,1905,1907,1910],{"class":238,"line":287},[236,1895,1873],{"class":593},[236,1897,989],{"class":246},[236,1899,271],{"class":242},[236,1901,1902],{"class":267},"Protocol",[236,1904,271],{"class":242},[236,1906,1885],{"class":246},[236,1908,1909],{"class":1888},"protocolVersion",[236,1911,998],{"class":246},[236,1913,1914,1916,1918,1920,1923,1925,1927,1930],{"class":238,"line":304},[236,1915,1873],{"class":593},[236,1917,989],{"class":246},[236,1919,271],{"class":242},[236,1921,1922],{"class":267},"Enabled",[236,1924,271],{"class":242},[236,1926,1885],{"class":246},[236,1928,1929],{"class":1888},"enabled",[236,1931,998],{"class":246},[236,1933,1934],{"class":238,"line":321},[236,1935,568],{"emptyLinePlaceholder":567},[236,1937,1938,1941,1944,1947,1950,1953,1956,1959,1962],{"class":238,"line":327},[236,1939,1940],{"class":608},"for",[236,1942,1943],{"class":246}," _, method ",[236,1945,1946],{"class":608},"in",[236,1948,1949],{"class":593}," ipairs",[236,1951,1952],{"class":246},"(capabilities.",[236,1954,1955],{"class":1888},"bridgeMethods",[236,1957,1958],{"class":242}," or",[236,1960,1961],{"class":246}," {}) ",[236,1963,1964],{"class":608},"do\n",[236,1966,1967,1969,1971,1973,1976,1978],{"class":238,"line":337},[236,1968,624],{"class":593},[236,1970,989],{"class":246},[236,1972,271],{"class":242},[236,1974,1975],{"class":267},"Bridge method",[236,1977,271],{"class":242},[236,1979,1980],{"class":246},", method)\n",[236,1982,1983],{"class":238,"line":353},[236,1984,649],{"class":608},[10,1986,1987],{},"Use capability detection instead of assuming that a future Free Phone version supports a specific\nbridge extension.",[1989,1990,1991],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":232,"searchDepth":239,"depth":256,"links":1993},[1994],{"id":36,"depth":256,"text":5,"children":1995},[1996,1997,1998,1999,2000,2001,2002,2003],{"id":47,"depth":277,"text":50},{"id":658,"depth":277,"text":661},{"id":929,"depth":277,"text":932},{"id":1042,"depth":277,"text":1045},{"id":1240,"depth":277,"text":1243},{"id":1346,"depth":277,"text":1349},{"id":1553,"depth":277,"text":1556},{"id":1819,"depth":277,"text":1822},"Client Exports for the Free Phone custom-app, billing and CrewLink integrations.","md",null,{},"/docs/scripts/free-phone/exports/client-exports",{"title":5,"description":2004},{"loc":2008},"1.docs/scripts/4.free-phone/3.exports/1.client-exports","mk2o7_OcwLhsZpA7MxruQuXFQ462oQzDibndIXSxokQ",[2014,2018],{"title":2015,"path":15,"stem":2016,"children":-1,"description":2017},"Exports","1.docs/scripts/4.free-phone/3.exports","Client and server exports provided by Free Phone, with arguments, return values, security boundaries, and complete Lua examples.",{"title":2019,"path":2020,"stem":2021,"description":2022,"children":-1},"Server Exports","/docs/scripts/free-phone/exports/server-exports","1.docs/scripts/4.free-phone/3.exports/2.server-exports","Server Exports for the Free Phone custom-app, billing and CrewLink integrations.",[],1791814186055]